2017-01-18 10 views
0

私はWSDLは、以下のcomplexType含むWebサービスと通信する必要があります。私はjava.util.Date値を割り当てる有する1つの動作中JAX-WS(JAXB):java.util.Dateをxs:anyTypeに整列してxs:dateTimeの代わりにxs:dateとして整列する方法は?

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "KlarigoField", propOrder = { 
    "value", 
    "metadata" 
}) 
public class KlarigoField { 

    @XmlElement(name = "Value", nillable = true) 
    protected Object value; 
    @XmlElement(name = "Metadata", nillable = true) 
    protected KlarigoFieldMetadata metadata; 

    public Object getValue() { 
     return value; 
    } 

    public void setValue(Object value) { 
     this.value = value; 
    } 

    public KlarigoFieldMetadata getMetadata() { 
     return metadata; 
    } 

    public void setMetadata(KlarigoFieldMetadata value) { 
     this.metadata = value; 
    } 

} 

:この部分によれ

<complexType name="KlarigoField"> 
     <complexContent> 
      <sequence> 
      <element name="Value" type="{http://www.w3.org/2001/XMLSchema}anyType" minOccurs="0"/> 
      <element name="Metadata" type="{http://klarigo.ru/main}KlarigoFieldMetadata" minOccurs="0"/> 
      </sequence> 
     </complexContent> 
    </complexType> 

を、JAXBは、次のクラスを生成します私が次の出力を得る "値"要素に:

<Value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:dateTime"> 
2017-01-25T00:00:00+03:00 
</Value> 

私は値を取得する必要がありますタイプの電子 "XS:日付"、そのような何か:

<Value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:date"> 
2017-01-25 
</Value> 

JAXBは、デフォルトでxs:dateTimejava.util.Dateをマーシャル。私は、java.util.Datexs:dateと回答したhereにマーシャリングするカスタムアダプタを作成できることを読んだことがあります。問題は、このアダプタをjava.util.Dateフィールドにのみ適用し、java.lang.Objectxs:anyType)には適用できないということです。さらに、このフィールドは異なるタイプの値のコンテナとします。私の問題を解決するために私は何ができますか?


UPDATE:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "date", namespace = "http://www.w3.org/2001/XMLSchema", propOrder = { 
     "value" 
    }) 
    public class Date { 

     @XmlValue 
     @XmlJavaTypeAdapter(DateAdapter.class) 
     @XmlSchemaType(name = "date") 
     protected java.util.Date value; 

     public java.util.Date getValue() { 
      return value; 
     } 

     public void setValue(java.util.Date value) { 
      this.value = value; 
     } 

    } 

日アダプタ:私が作成

public class DateAdapter extends XmlAdapter<String, Date> { 

     private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 

     @Override 
     public Date unmarshal(String stringDate) throws Exception { 
      return DatatypeConverter.parseDate(stringDate).getTime(); 
     } 

     @Override 
     public String marshal(Date date) throws Exception { 
      synchronized (dateFormat) { 
       return dateFormat.format(date); 
      } 
     } 
    } 

私はjava.util.Dateをラップするカスタム "日付" タイプを作成して必要な結果を得るために管理している 私のカスタムタイプのオブジェクトは、実際のjava.util.Dateオブジェクトをそこに設定し、最後にそれを "Object value"フィールドに設定します:

my.custom.Date customDate = new my.custom.Date(); 
customDate.setValue(new java.util.Date(....)); 
klarigoField.setValue(customDate); 

最後に、私は自動生成のためのWSDLへの私のカスタム日付タイプを追加しました:

<schema targetNamespace="http://www.w3.org/2001/XMLSchema"> 
    <complexType name="date"> 
     <simpleContent> 
      <extension base="xs:date"/> 
     <simpleContent> 
    <complexType> 
<schema> 

答えて

1

はい、あなたは正しい方向を取得し、あなたがXmlAdapterを必要とする:

class DateAdapter extends XmlAdapter<String, Object> { 

    private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 

    @Override 
    public String marshal(Object v) throws Exception { 
     if (v.getClass() == Date.class) { 
      synchronized (dateFormat) { 
       return dateFormat.format(v); 
      } 
     } 
     return v.toString(); 
    } 
    // ...  
} 

としてすべての異なるタイプがtoStringを正しく上書きする限り、簡単にマーシャリングできます。

より:答えを

+0

ありがとう!私はすでにこのアダプタを使用しようとし、それを "Object value"フィールドに適用しました。問題は、出力に必要なタイプ、すなわちxsi:type = "xs:date"がないことでした。また、私は、オーバーライドされた非整列化メソッドを正しく実現することができませんでした。 –

+0

@RafaelIrgalin私はあなたが答えを見つけてうれしい:)。申し訳ありませんがあなたを助けません。 – Tony

+0

ああ、問題ありません、ありがとう!あなたの答えは他の人にとって役に立ちます;) –

関連する問題