Reputation: 6248
I am having problem unmarshalling xml element into character using JAXB2Marshaller.
My XML input contains one element <dateCheckFlag>Y</dateCheckFlag>
:
when I try to get dateCheckFlag
element value into Character
type in my pojo, it gives me null.
Assume all setter getter and constructor are present.
Can anybody help me out how to unmarshall xml element into Character...?
@XmlRootElement(name="Emp")
class Emp
{
@XmlElement(name="name");
String name;
@XmlElement(name="dateCheckFlag");
Character dateCheckFlag;
Emp(){}
Emp(String name, Character dateCheckFlag)
{
this.name= name;
this.dateCheckFlag = dateCheckFlag;
}
public void setName(String name)
{
this.name=name;
}
public String getName()
{
return name;
}
public void setDateCheckFlag(Character flag)
{
this.dateCheckFlag=flag;
}
public Character getName()
{
return dateCheckFlag;
}
Upvotes: 2
Views: 3132
Reputation: 149037
The JAXB (JSR-222) specification does not define the XML representation for char
/Character
.
By default that JAXB reference implmentation converts a Character
to the xs:unsignedShort
type. This means that it is expecting a document like:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Emp>
<name>Jane Doe</name>
<dateCheckFlag>89</dateCheckFlag>
</Emp>
XmlAdapter
You will be able to use an XmlAdapter
to get the XML that you are looking for. An XmlAdapter
allows you to convert one object to another for the purposes of changing the XML representation.
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class CharacterAdapter extends XmlAdapter<String, Character> {
@Override
public Character unmarshal(String string) throws Exception {
return string.charAt(0);
}
@Override
public String marshal(Character character) throws Exception {
return new String(new char[] {character});
}
}
Emp
The @XmlJavaTypeAdapter
annotation is used to specify the XmlAdapter
.
import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlRootElement(name = "Emp")
@XmlAccessorType(XmlAccessType.FIELD)
class Emp {
String name;
@XmlJavaTypeAdapter(CharacterAdapter.class)
Character dateCheckFlag;
}
Demo
Below is some code that converts the XML to/from the object model.
import java.io.File;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Emp.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum15240702/input.xml");
Emp emp = (Emp) unmarshaller.unmarshal(xml);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(emp, System.out);
}
}
input.xml/Output
<?xml version="1.0" encoding="UTF-8"?>
<Emp>
<name>Jane Doe</name>
<dateCheckFlag>Y</dateCheckFlag>
</Emp>
Upvotes: 1