简体   繁体   中英

JAXB2Marshaller not unmarshaling xml element into Character

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;
}

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>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM