未选择JAXB适配器

时间:2017-05-09 19:56:37

标签: java jaxb adapter

我有一个需要序列化的pojo项目。 pojo的原语具有“逻辑空”(当原语等于某个特定值时,它为空) 序列化的要求是将其返回为null,因此我必须创建适配器,其中我用对象包装基元,如果基元是“null”,则将对象设置为null。

问题是没有拾取适配器。接线通过package-info完成。

对象:

@XmlRootElement
public class Item {
    String name;
    int id;
    long price;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public long getPrice() {
        return price;
    }
    public void setPrice(long price) {
        this.price = price;
    }


    @XmlTransient
    public boolean isIdNull(){
        return id==-99888899;
    }
    @XmlTransient
    public boolean isPriceNull(){
        return price==-1775445454544L;
    }

这是带适配器的包装类。

@XmlType(name = "item")
public class ItemAdapterWrapper {

    String name;
    Integer id;
    Long price;

    @XmlElement
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @XmlElement
    public Long getPrice() {
        return price;
    }

    public void setPrice(Long price) {
        this.price = price;
    }

    public void setName(String name) {
        this.name = name;
    }

    @XmlElement
    public String getName() {
        return name;
    }

    public static class ItemAdapter extends XmlAdapter<ItemAdapterWrapper, Item> {

        @Override
        public Item unmarshal(ItemAdapterWrapper v) throws Exception {
            if (v == null) {
                return null;
            }

            Item item = new Item();

            if (v.getName() != null)
                item.setName(v.getName());

            if (v.getPrice() != null)
                item.setPrice(v.getPrice());

            if (v.getId() != null)
                item.setId(v.getId());

            return item;
        }

        @Override
        public ItemAdapterWrapper marshal(Item v) throws Exception {
            if (v == null) {
                return null;
            }

            ItemAdapterWrapper ItemAdapterWrapper = new ItemAdapterWrapper();

            if (!v.isIdNull()) {
                ItemAdapterWrapper.setId(v.getId());
            }

            if (!v.isPriceNull()) {
                ItemAdapterWrapper.setPrice(v.getPrice());
            }

            ItemAdapterWrapper.setName(v.getName());

            return ItemAdapterWrapper;
        }

    }

package-info.java:

    @XmlJavaTypeAdapters({
        @javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(value=ItemAdapterWrapper.ItemAdapter.class, type=Item.class) })  
package org.datatypes;

所有都在同一个包中。 当我试图编组时:

Item item = new Item();
item.setName("XXX");
item.setId(4);

StringWriter output = new StringWriter();
JAXBContext context = JAXBContext.newInstance(Item.class);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
m.marshal(item, output);
System.out.println(output.toString());

未触发适配器类(我设置断点)并且原始项目已被序列化。

我错过了什么?

这不像现有的问题,因为我没有关于pojo的注释,而且我使用package-info。

0 个答案:

没有答案