私は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:dateTime
へjava.util.Date
をマーシャル。私は、java.util.Date
をxs:date
と回答したhereにマーシャリングするカスタムアダプタを作成できることを読んだことがあります。問題は、このアダプタをjava.util.Date
フィールドにのみ適用し、java.lang.Object
(xs: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>
ありがとう!私はすでにこのアダプタを使用しようとし、それを "Object value"フィールドに適用しました。問題は、出力に必要なタイプ、すなわちxsi:type = "xs:date"がないことでした。また、私は、オーバーライドされた非整列化メソッドを正しく実現することができませんでした。 –
@RafaelIrgalin私はあなたが答えを見つけてうれしい:)。申し訳ありませんがあなたを助けません。 – Tony
ああ、問題ありません、ありがとう!あなたの答えは他の人にとって役に立ちます;) –