为了使用JAXB编组一个长基本类型,我使用了@ XmlJavaTypeAdapter
注释,它将非String类型调整为String。即使它为长类型抛出错误。为什么会这样?如何对long
id属性进行编组?
User.java
class User {
@XmlID
@XmlJavaTypeAdapter(WSLongAdapter.class)
private long id;
// Other variables
// Getter & Setter method
}
WSLongAdapter.java
public class WSLongAdapter extends XmlAdapter<String, Long>{
@Override
public String marshal(Long id) throws Exception {
if(id==null) return "" ;
return id.toString();
}
@Override
public Long unmarshal(String id) throws Exception {
return Long.parseLong(id);
}
}
MarshallTest.java
public static void main(String[] args) {
try{
JAXBContext jaxbContext= JAXBContext.newInstance(User.class);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
OutputStreamWriter writer = new OutputStreamWriter(System.out);
// Manually open the root element
writer.write("<user>");
// Marshal the objects out individually
marshaller.marshal(new User(), writer);
// Manually close the root element
writer.write("</user>");
writer.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
错误:
com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 4 counts of IllegalAnnotationExceptions
Adapter com.v4common.shared.util.other.WSLongAdapter is not applicable to the field type long.
this problem is related to the following location:
at @javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(type=class javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter$DEFAULT, value=class com.v4common.shared.util.other.WSLongAdapter)
at private long com.v4common.shared.beans.usermanagement.User.id
at com.v4common.shared.beans.usermanagement.User
Property "id" has an XmlID annotation but its type is not String.
this problem is related to the following location:
at private long com.v4common.shared.beans.usermanagement.User.id
at com.v4common.shared.beans.usermanagement.User
There are two properties named "id"
答案 0 :(得分:6)
在注释中指定基本类:
@XmlJavaTypeAdapter(type=long.class, value=WSLongAdapter.class)
答案 1 :(得分:4)
以下可能有效:
class User {
@XmlID
@XmlJavaTypeAdapter(WSLongAdapter.class)
@XmlElement(type=Long.class)
private long id;
// Other variables
// Getter & Setter method
}
答案 2 :(得分:1)
创建使用@XmlID
注释的新getter返回String
@XmlAccessorType(XmlAccessType.FIELD)
class User {
private long id;
@XmlID
public String getReferenceId() {
return Long.toString(id);
}
}
此解决方案的唯一缺点是序列化XML中存在其他标记(在本例中为<referenceId>
)。我尝试通过使用@XmlTransient
注释getter来删除它,但后来我收到错误通知引用类中不存在ID。
答案 3 :(得分:0)
只需替换
@XmlElement(type=Long.class)
private long id;
与
@XmlSchemaType(name = "long")
protected Long id;