如何使用自定义日期和 apache CXF 生成正确的 WSDL,仅使用注释

pde*_*dem 5 java wsdl web-services cxf jaxb

我正在使用来自 org.threeten.bp 库的自定义日期,但它应该与 Joda Time 相同,或者我猜是 Java8 次。

我能够使用自定义日期表单 Threeten 模块开发我的 Web 服务,使用 JAXB 适配器从/到 LocalDate 类型进行编组。

这是我的问题,webservice 使用soapui 或其他程序运行得非常好,但是暴露的WSDL 给了我一个String 类型而不是dateTime

<xs:complexType name="MyDTO">
<xs:sequence>
<xs:element minOccurs="0" name="testDate" type="xs:string"/>
<xs:element minOccurs="0" name="code" type="xs:string"/>
<xs:/sequence>
<xs:/complexType>
Run Code Online (Sandbox Code Playgroud)

我期待type="xs:dateTime"为我的日期,但我得到了 type="xs:string"

物体:

public class MyDTO implements Serializable {
    public LocalDateTime testDate;
    public String code;
}
Run Code Online (Sandbox Code Playgroud)

我尝试在 package-info.java 级别使用注释:

@javax.xml.bind.annotation.XmlSchemaTypes({ 
    @javax.xml.bind.annotation.XmlSchemaType(name = "dateTime", type = org.threeten.bp.LocalDate.class),
    @javax.xml.bind.annotation.XmlSchemaType(name = "dateTime", type = org.threeten.bp.LocalDateTime.class),
    @javax.xml.bind.annotation.XmlSchemaType(name = "dateTime", type = org.threeten.bp.LocalTime.class) })
@javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters({
    @XmlJavaTypeAdapter(type = LocalDate.class, value = LocalDateXmlAdapter.class),
    @XmlJavaTypeAdapter(type = LocalTime.class, value = LocalTimeXmlAdapter.class),
    @XmlJavaTypeAdapter(type = LocalDateTime.class, value = LocalDateTimeXmlAdapter.class)})
package mypackage.dto;

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

import org.threeten.bp.LocalDate;
import org.threeten.bp.LocalDateTime;
import org.threeten.bp.LocalTime;

import com.migesok.jaxb.adapter.javatime.LocalDateTimeXmlAdapter;
import com.migesok.jaxb.adapter.javatime.LocalDateXmlAdapter;
import com.migesok.jaxb.adapter.javatime.LocalTimeXmlAdapter;
Run Code Online (Sandbox Code Playgroud)

我的适配器在这里:https : //github.com/pdemanget/jaxb-threeten-adapters

它们从 LocalDate 转换为 String,我想完全避免使用 java.util.Date。

我有大约 300 个类要管理,因此更改每个对象的类型,或者给出特定的注释不是我想要做的。

我无论如何都会尝试一些不同的选择

字段级别使用注释

 @javax.xml.bind.annotation.XmlSchemaType(name = "dateTime")
 public LocalDateTime testDate;
  //it works well on field, but not on package level and i would have 300classes to modify
Run Code Online (Sandbox Code Playgroud)

级别使用注释

 @XmlType(name = "dateTime", namespace = "http://www.w3.org/2001/XMLSchema")
 class LocalDateTime
 //It works well on Class, bu not on package level, and I would have to patch the library I use, This is rally impossible.
Run Code Online (Sandbox Code Playgroud)

级别 使用注释@XmlSchemaTypes:我选择的解决方案在包级别允许,但它根本不起作用,它似乎因适配器使用而过载@XmlJavaTypeAdapters

我还找到了一些基于 XML 的解决方案,但我想使用注释,这可能吗?