簡答
的boolean
返回類型是一個文檔的錯誤。返回類型應爲void
。
長的答案
我的意思是,無論如何,使用轉換JPA的龍@Id到 JAXB的String此方法@XmlID
你可以使用EclipseLink JAXB (MOXy),因爲它不具備用@XmlID
註解的字段/屬性的類型爲String
。
與JAXB-RI和沒有MOXy。
你可以使用一個XmlAdapter
映射支持你的使用情況:
IDAdapter
這XmlAdapter
的Long
值轉換爲String
值,以滿足@XmlID
標註的要求。
package forum9629948;
import javax.xml.bind.DatatypeConverter;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class IDAdapter extends XmlAdapter<String, Long> {
@Override
public Long unmarshal(String string) throws Exception {
return DatatypeConverter.parseLong(string);
}
@Override
public String marshal(Long value) throws Exception {
return DatatypeConverter.printLong(value);
}
}
乙
的@XmlJavaTypeAdapter
註釋用於指定XmlAdapter
:
package forum9629948;
import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlAccessorType(XmlAccessType.FIELD)
public class B {
@XmlAttribute
@XmlID
@XmlJavaTypeAdapter(IDAdapter.class)
private Long id;
}
甲
package forum9629948;
import javax.xml.bind.annotation.*;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class A {
private B b;
private C c;
}
Ç
package forum9629948;
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)public class C {
@XmlAttribute
@XmlIDREF
private B b;
}
演示
package forum9629948;
import java.io.File;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(A.class);
File xml = new File("src/forum9629948/input.xml");
Unmarshaller unmarshaller = jc.createUnmarshaller();
A a = (A) unmarshaller.unmarshal(xml);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(a, System.out);
}
}
輸入/輸出
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<a>
<b id="123"/>
<c b="123"/>
</a>