6

次のように注釈が付けられたオブジェクトにStringプロパティがあります。

@XmlElement(name = "Item", required = true, nillable = true)
private String item;

マーシャリング後の結果は

<Item xsi:nil="true"/>

私はそれをしたい間

<Item/>

私のXMLメッセージを受け入れるサードパーティのサービスは、後者の場合のようにそれを望んでいるからです。私はjaxb2を使用しています。誰かが私がこれを行うことができる方法を知っていますか?

どうもありがとう

4

2 に答える 2

1

注: 私はEclipseLink JAXB(MOXy)のリーダーであり、JAXB(JSR-222)エキスパートグループのメンバーです。

次の例では、JAXBプロバイダーとしてMOXyを使用する必要があります。XmlAdapterこれは、フィールド/プロパティがnullの場合、JAXBRIがを呼び出さないためです。JAXBプロバイダーとしてMOXyを指定する方法については、以下を参照してください。

StringAdapter

XmlAdapter、String値を。で注釈が付けられたプロパティを持つオブジェクトに変換します@XmlValue

package forum8986842;

import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlAdapter;

public class StringAdapter extends XmlAdapter<StringAdapter.AdaptedString, String>{

    @Override
    public String unmarshal(AdaptedString adaptedString) throws Exception {
        if(null == adaptedString) {
            return null;
        }
        String string = adaptedString.value;
        if("".equals(string)) {
            return null;
        }
        return string;
    }

    @Override
    public AdaptedString marshal(String string) throws Exception {
        AdaptedString adaptedString = new AdaptedString();
        adaptedString.value = string;
        return adaptedString;
    }

    public static class AdaptedString {
        @XmlValue public String value;
    }

}

@XmlJavaTypeAdapter注釈は、XmlAdapter:を指定するために使用されます。

package forum8986842;

import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlRootElement(name="Root")
public class Root {

    private String item;

    @XmlElement(name = "Item", required = true, nillable = true)
    @XmlJavaTypeAdapter(StringAdapter.class)
    public String getItem() {
        return item;
    }

    public void setItem(String item) {
        this.item = item;
    }

}

デモ

次のコードを使用して、上記のマッピングを示すことができます。2つのドキュメントが使用され、1つは空のItem要素で、もう1つは入力された要素で使用されItemます。

package forum8986842;

import java.io.StringReader;
import javax.xml.bind.*;

public class Demo {

    private JAXBContext jc;

    public Demo() throws JAXBException {
        jc = JAXBContext.newInstance(Root.class);
    }

    public static void main(String[] args) throws Exception {
        Demo demo = new Demo();
        demo.demo("<Root><Item/></Root>");
        demo.demo("<Root><Item>Hello World</Item></Root>");
    }

    private void demo(String xml) throws JAXBException {
        System.out.println("\n\nINPUT:  " + xml);
        StringReader stringReader = new StringReader(xml);
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Root root = (Root) unmarshaller.unmarshal(stringReader);

        System.out.println("ITEM:   " + root.getItem());

        System.out.print("OUTPUT: ");
        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
        marshaller.marshal(root, System.out);
    }

}

出力

以下は、デモコードの実行からの出力です。

INPUT:  <Root><Item/></Root>
ITEM:   null
OUTPUT: <Root><Item/></Root>

INPUT:  <Root><Item>Hello World</Item></Root>
ITEM:   Hello World
OUTPUT: <Root><Item>Hello World</Item></Root>

詳細については

于 2012-01-24T20:29:56.140 に答える
-1

xsdの変更が簡単であることがわかりました

<xs:element name="name">
   <xs:complexType/>
</xs:element>

そしてあなたのコードでは、あなたがあなたのjava src/classesを自動生成するとき

新しい名前を指定し、その名前を、その下にあるオブジェクト名に設定します。

于 2012-04-23T18:57:11.753 に答える