2012-05-02 2 views
4

私は、文字列のマップをマーシャリングするために構築したカスタムXMLアダプタ用のXmlTypeを持つPOJOオブジェクトを使用しています。私は問題を抱えていますが、ヌル値を適切に使用できるようにすることで問題が発生しています。私はそれを動作させることができましたが、私はそれが生成しているXMLに満足していません。xmlアダプタで使用されるカスタムタイプのnull値を整列する

これは私が現在取り組んでいる作業ですが、サンプルのXML結果からわかるように、適切なxmlns:xsi = "http://www.w3.org"は含まれていません/ 2001/XMLスキーマ・インスタンス」のxsi:なし= "真" 値

@XmlType(name="element") 
public class RestMapElements { 

    @XmlAttribute(name="name") 
    public String key; 
    @XmlValue 
    public String value; 

    public RestMapElements(String key, String value) { 
    this.key = key; 
    this.value = value; 
    } 
} 

(関連データにスリミング)得られたXML。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
... 
    <element-list> 
     <item name="activated_date">2012-03-29 11:34:14.323</item> 
     <item name="some_null_value"/> 
    </element-list> 
... 

しかし、私はちょうどXMLはそれを動作させるために項目タグの内側に追加の「値」のタグを追加することに満足していないよ、それはこれで仕事を得ることができました。 (サイドノート、私は、XMLType名の宣言で指定しようとしたように、なぜそれではなく、要素の項目に命名された?)

@XmlType(name="element") 
public class RestMapElements { 

    @XmlAttribute(name="name") 
    public String key; 
    @XmlElement(nillable = true) 
    public String value; 

    public RestMapElements(String key, String value) { 
    this.key = key; 
    this.value = value; 
    } 
} 

を再度、(関連データにスリム化)結果のXMLを。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
... 
<element-list> 
    <item name="activated_date"><value>2012-03-29 11:34:14.323</value></item> 
    <item name="some_null_value"><value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/></item> 
</element-list> 
... 

実際には、問題を解決するために2番目の方法を使用できます。私はちょうど注釈を使ってJAXBがこれを私が探しているものに曲げることを許可するかどうかを知るための学習経験として、空白値をサポートできるようにアイテムタグの下に付加的な値タグを追加する必要がないようにしたい。今、最初の例で非整列化すると、nullの代わりに空の文字列を取得することになります。 2番目の例では、私が期待していたヌル値を取得します。

参考:現在、Jersey 1.11を使用しています。

答えて

0

問題があります。 item要素がxsi:nil="true"の場合、ArrayList(または何でも)の対応するRestMapElementsエントリをnullに設定し、属性を失うことによってのみ生成されます。私はこれにはあまり解決策がないと思います。

1つのオプションは、以下のものを使用してあなたのポストとアンマーシャリングの最初からあなたのマーシャリングを使用することです:

あなたはこのような何かをやっている場合:

@XmlElementWrapper(name="element-list") 
@XmlElement(name="item") 
public ArrayList<RestMapElements> list; 

をあなたはXmlAdapterにを使用することができますvalueが空Stringであるかどうかを確認し、それがある場合nullに設定します。

@XmlElementWrapper(name="element-list") 
@XmlElement(name="item") 
@XmlJavaTypeAdapter(ItemAdapter.class) 
public ArrayList<RestMapElements> list; 

そしてItemAdapter

public class ItemAdapter extends XmlAdapter<RestMapElements, RestMapElements> { 

    @Override 
    public RestMapElements unmarshal(RestMapElements v) throws Exception { 
     if (v.value.equals("")) v.value = null; 
     return v; 
    } 
} 

これはまだ洗練私見ですが。 適切なxsi:nil="true"item要素を生成したい場合、これは明らかにあなたが望むものではありません。

幸運。

+0

はええ、私はその解決策から離れようとする。私はそれをXmlAdapterで修正するだけでも、それを考えましたが、サービスが正しいようにして、Webサービス上のライブラリを構築するときに、同じ実装として動作するようにします。ラッパー・ライブラリーをRESTサービスのストレート・トランスレーターにしておきたいと思っています。 – rmmeans

2

注:私はEclipseLink JAXB (MOXy)の鉛とJAXB 2 (JSR-222)専門家のメンバーです。

あなたはこのユースケースをマップするためにMOXYの@XmlNullPolicy拡張子を使用することができます。

RestMapElements

package forum10415075; 

import javax.xml.bind.annotation.*; 
import org.eclipse.persistence.oxm.annotations.*; 

@XmlType(name="element") 
public class RestMapElements { 

    @XmlAttribute(name="name") 
    public String key; 

    @XmlValue 
    @XmlNullPolicy(nullRepresentationForXml=XmlMarshalNullRepresentation.XSI_NIL) 
    public String value; 

} 

ルート

package forum10415075; 

import java.util.*; 
import javax.xml.bind.annotation.*; 

@XmlRootElement 
public class Root { 

    @XmlElementWrapper(name="element-list") 
    @XmlElement(name="item") 
    public List<RestMapElements> items = new ArrayList<RestMapElements>(); 

} 

jaxb.propertiesを は、あなたが以下の内容で、あなたのドメインモデルと同じパッケージにjaxb.propertiesと呼ばれるファイルを追加する必要があり、あなたのJAXB(JSR-222)プロバイダとしてMOXYを使用するには:

javax.xml.bind.context.factory = org.eclipse.persistence.jaxb.JAXBContextFactory 

デモ

package forum10415075; 

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

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Root.class); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     File xml = new File("src/forum10415075/input.xml"); 
     Root root = (Root) unmarshaller.unmarshal(xml); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(root, System.out); 
    } 

} 

input.xmlに/出力

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <element-list> 
     <item name="activated_date">2012-03-29 11:34:14.323</item> 
     <item name="some_null_value" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/> 
    </element-list> 
</root> 

MOXYまたはWebLogic 12.1.1が既に含まれているあなたはGlassFishの3.1.2でジャージーを使用している場合は

注:

+0

詳細な回答ありがとうございます。 MOXyが解決する他のJAXBの問題については、他の記事を見てきましたが、私たちはリファレンス実装に固執しようとしています。 MOXyを使うつもりなら、あなたのソリューションはうまくいくでしょう! – rmmeans

+0

親愛なる@BlaiseDoughan将来のJAXBで '@XmlValue'に' nillable'要素を入れる可能性はありますか? –

+0

親愛なる@BlaiseDoughan '@ XmlRootElement'のああ' nillable'が良いでしょう。 :) –

関連する問題