gpt4 book ai didi

java - JAX-WS (JAXB) : How to marshall java. util.Date 到 xs :anyType as xs:date instead of xs:dateTime?

转载 作者:行者123 更新时间:2023-12-01 09:00:30 27 4
gpt4 key购买 nike

我必须与 WSDL 包含以下复杂类型的 Web 服务通信:

    <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生成以下类:

@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;
}

}

在一次操作期间,我必须将 java.util.Date 值分配给“Value”元素,在该元素中我会得到以下输出:

<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:date”类型的值,类似这样的值:

<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 将 java.util.Date 编码为 xs:dateTime。我读到我们可以创建一个自定义适配器,将 java.util.Date 编码到 xs:date 中,就像回答 here 一样。 。问题是我们只能将此适配器应用于 java.util.Date 字段,而不是 java.lang.Object (xs:anyType ),此外,该字段应该是不同类型值的容器。我可以做什么来解决我的问题?

<小时/>

更新:我成功地通过创建一个包装 java.util.Date 的自定义“日期”类型来获得所需的结果:

@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 对象,最后将其设置到“对象值”字段中:

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>

最佳答案

是的,你得到了正确的方向,你需要一个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,您就可以轻松编码。

更多:

关于java - JAX-WS (JAXB) : How to marshall java. util.Date 到 xs :anyType as xs:date instead of xs:dateTime?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41713884/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com