N
news
Hi
I've come upon a problem which I just can't figure out.
So, here's a little about the context. An enterprise-application is
running on a Java EE-server. Some POJOs are annotated as Java
Persistence entities aswell as JAXB-annotations to create wanted XML-
representation for them. All annotations are added manually (meaning
no auto-generated classes/factory). A Servlet acts as an interface
against an Ajax-enabled webpage. The script in the web-page retrieves
xml-representation from the servlet and should also send xml back on
the same form for persisting on the server. The script returns the xml
in string-representation.
And here's the problem. Marshalling to xml works just as it should.
The script returns an xml in the exact same form, but the
unmarshalling of it does not produce what is expected. An object for
the main class is created, however any referenced objects are not
created. Primitive fields are generated correctly. No error is thrown.
Simplified, this is how it looks:
---List.java---
@XmlRootElement(name="list")
@XmlType(name="ListType")
@Enitity //JPA
public class List implements Serializable {
private Long id;
private weekNumber;
private Set<Element> elements;
@XmlAttribute(name="weeknumber", required=true)
public void getWeekNumber() {
//...
}
@XmlAttribute(name="id", required=true)
public void getId() {
//...
}
@XmlElementWrapper(name="elements", nillable=false)
@XmlElementRef
@ManyToMany( //JPA
//...
)
public void getElements() {
//...
}
}
---Element.java---
@XmlRootElement(name="element")
@XmlType(name="ElementType")
public class Element implements Serializable {
//...
private Long id;
@XmlAttribute(name="id", required=true)
public void getId() {
//...
}
//...
}
---xml---
<?xml .....>
<ns2:list ..... weeknumber="3" id="21">
<elements>
<ns2:element ... id="42">
...
</ns2:element>
<ns2:element ... id="43">
...
</ns2:element>
...
</elements>
</ns2:list>
In this example, a List-object would be created by the unmarshaller,
however the referenced elements of class Element will not. And I have
no idea why! The package contains a jaxb.index with all class names,
and I also added an ObjectFactory, but the result was the same. Here's
the unmarshalling:
private <T> T recieve(Class<T> classType, String xml) {
JAXBElement<T> obj = null;
try {
JAXBContext jc =
JAXBContext.newInstance(classType.getPackage().getName());
Unmarshaller um = jc.createUnmarshaller();
obj = (JAXBElement<T>)um.unmarshal(new StreamSource(new
StringReader(xml)));
} catch(JAXBException jex) {
jex.printStackTrace();
}
return obj.getValue();
}
I hope someone has something wise to say about this. I've really
twisted my brain to try to figure it out!
Thanks.
I've come upon a problem which I just can't figure out.
So, here's a little about the context. An enterprise-application is
running on a Java EE-server. Some POJOs are annotated as Java
Persistence entities aswell as JAXB-annotations to create wanted XML-
representation for them. All annotations are added manually (meaning
no auto-generated classes/factory). A Servlet acts as an interface
against an Ajax-enabled webpage. The script in the web-page retrieves
xml-representation from the servlet and should also send xml back on
the same form for persisting on the server. The script returns the xml
in string-representation.
And here's the problem. Marshalling to xml works just as it should.
The script returns an xml in the exact same form, but the
unmarshalling of it does not produce what is expected. An object for
the main class is created, however any referenced objects are not
created. Primitive fields are generated correctly. No error is thrown.
Simplified, this is how it looks:
---List.java---
@XmlRootElement(name="list")
@XmlType(name="ListType")
@Enitity //JPA
public class List implements Serializable {
private Long id;
private weekNumber;
private Set<Element> elements;
@XmlAttribute(name="weeknumber", required=true)
public void getWeekNumber() {
//...
}
@XmlAttribute(name="id", required=true)
public void getId() {
//...
}
@XmlElementWrapper(name="elements", nillable=false)
@XmlElementRef
@ManyToMany( //JPA
//...
)
public void getElements() {
//...
}
}
---Element.java---
@XmlRootElement(name="element")
@XmlType(name="ElementType")
public class Element implements Serializable {
//...
private Long id;
@XmlAttribute(name="id", required=true)
public void getId() {
//...
}
//...
}
---xml---
<?xml .....>
<ns2:list ..... weeknumber="3" id="21">
<elements>
<ns2:element ... id="42">
...
</ns2:element>
<ns2:element ... id="43">
...
</ns2:element>
...
</elements>
</ns2:list>
In this example, a List-object would be created by the unmarshaller,
however the referenced elements of class Element will not. And I have
no idea why! The package contains a jaxb.index with all class names,
and I also added an ObjectFactory, but the result was the same. Here's
the unmarshalling:
private <T> T recieve(Class<T> classType, String xml) {
JAXBElement<T> obj = null;
try {
JAXBContext jc =
JAXBContext.newInstance(classType.getPackage().getName());
Unmarshaller um = jc.createUnmarshaller();
obj = (JAXBElement<T>)um.unmarshal(new StreamSource(new
StringReader(xml)));
} catch(JAXBException jex) {
jex.printStackTrace();
}
return obj.getValue();
}
I hope someone has something wise to say about this. I've really
twisted my brain to try to figure it out!
Thanks.