我有一个需要序列化的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。