ご回答ありがとうございます。非常に単純なシナリオではうまくいくようですが、もう少し複雑なシナリオではうまくいきません。
私は自分のドメインであなたのコードを模倣しようとしましたが、データをマーシャリングではなくアンマーシャリングしているだけです。
アダプタ クラス:
public class DeleteStringAdapter extends XmlAdapter<DeletableString, String> {
@Override
public DeletableString marshal(String value) throws Exception {
System.out.println("MARSHALL: " + value);
return new DeletableString(value);
}
@Override
public String unmarshal(DeletableString v) throws Exception {
System.out.println("UNMARSHALL: " + v);
if(v.isDelete() != null && v.isDelete()){
return null;
}
return v.getValue();
}
}
アダプターの種類:
public class DeletableString {
public DeletableString() {
}
public DeletableString(String value) {
this.value = value;
}
private Boolean delete;
private String value;
@XmlAttribute
public Boolean isDelete() {
return delete;
}
public void setDelete(Boolean delete) {
this.delete = delete;
}
@XmlValue
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
@Override
public String toString() {
return DeletableString.class.getSimpleName() + "[delete=" + isDelete() + ", value=" + value + "]";
}
}
注釈付きの作業ドメイン クラス:
@XmlAccessorType(XmlAccessType.PROPERTY)
@XmlRootElement(name = "xml-fragment")
public class SimpleNavne implements Serializable{
private String forNavn = "";
private String fornavneMrkKode = "";
@XmlElement(name="PersonGivenName")
@XmlJavaTypeAdapter(value = DeleteStringAdapter.class)
public String getForNavn() {
return forNavn;
}
public void setForNavn(String forNavn) {
this.forNavn = forNavn;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append(SimpleNavne.class.getSimpleName() + "[");
builder.append("forNavn=");
builder.append(forNavn);
builder.append("]");
return builder.toString();
}
}
デモ
public class AppTest {
@Test
public void testApp() throws Exception {
System.setProperty("jaxb.debug", "true");
try{
JAXBContext jaxbContext = JAXBContext.newInstance(SimpleNavne.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Object ps = unmarshaller.unmarshal(new File("./personname-test4.xml"));
System.out.println(ps);
}catch(Exception e){
e.printStackTrace();
}
}
}
ファイル:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns:xml-fragment xmlns:ns="http://cpr.csc.com/navne">
<ns:PersonGivenName delete="false">010</ns:PersonGivenName>
</ns:xml-fragment>
出力から結論付けられた場合、上記は正常に機能するようです
SimpleNavne[forNavn=010]
ただし、SimpleName ドメイン クラスに @XMLPath で注釈が付けられたフィールドを導入すると問題が発生します。
変更されたドメイン クラス
@XmlAccessorType(XmlAccessType.PROPERTY)
@XmlRootElement(name = "xml-fragment")
public class SimpleNavne implements Serializable{
private String forNavn = "";
private String fornavneMrkKode = "";
@XmlElement(name="PersonGivenName")
@XmlJavaTypeAdapter(value = DeleteStringAdapter.class)
public String getForNavn() {
return forNavn;
}
public void setForNavn(String forNavn) {
this.forNavn = forNavn;
}
@XmlPath("/PersonGivenNameMarkingStructure/MarkingCode/text()")
public String getFornavneMrkKode() {
return fornavneMrkKode;
}
public void setFornavneMrkKode(String forNavnMrk) {
this.fornavneMrkKode = forNavnMrk;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append(SimpleNavne.class.getSimpleName() + "[");
builder.append(", forNavn=");
builder.append(forNavn);
builder.append(", fornavneMrkKode=");
builder.append(fornavneMrkKode);
builder.append("]");
return builder.toString();
}
}
変更されたファイル:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns:xml-fragment xmlns:ns="http://cpr.csc.com/navne">
<ns:PersonGivenName delete="true">010</ns:PersonGivenName>
<ns:PersonGivenNameMarkingStructure>
<ns:MarkingCode>011</ns:MarkingCode>
</ns:PersonGivenNameMarkingStructure>
</ns:xml-fragment>
出力は次のとおりです。
SimpleNavne[forNavn=010, fornavneMrkKode=]
しかし、次のようになっているはずです:
SimpleNavne[forNavn=010, fornavneMrkKode=011]
私は何か完全に間違っていますか、それとも MOXy はこのシナリオをサポートしていませんか?
PS。MOXy 2.1.1 と 2.2.0-M3 を使用してみましたが、同じ結果が得られました