JAXB,自定义绑定,Adapter1.class和Joda-time

mdm*_*mdm 11 java binding annotations jaxb

我有一个问题,JAXB生成XML模式的绑定类的方式(为了精度,我无法修改).我想将xsd:date类型映射到Joda-time LocalDate对象,这里阅读,这里这里,我创建了以下DateAdapter类:

public class DateAdapter extends XmlAdapter<String,LocalDate> {
    private static DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyyMMdd");

    public LocalDate unmarshal(String v) throws Exception {
        return fmt.parseLocalDate(v);
    }

    public String marshal(LocalDate v) throws Exception {
        return v.toString("yyyyMMdd");
    }
}
Run Code Online (Sandbox Code Playgroud)

我将以下内容添加到我的全局绑定文件中:

  <jaxb:globalBindings>
        <jaxb:javaType name="org.joda.time.LocalDate" xmlType="xs:date"
            parseMethod="my.classes.adapters.DateAdapter.unmarshal"
            printMethod="my.classes.adapters.DateAdapter.marshal" />
    </jaxb:globalBindings>
Run Code Online (Sandbox Code Playgroud)

问题是,当我尝试maven编译我的项目时,它失败并出现以下错误:

[ERROR] \My\Path\MyProject\target\generated-sources\xjc\my\classes\generated\Adapter1.java:[20,59] non-static method unmarshal(java.lang.String) cannot be referenced from a static context
[ERROR] \My\Path\MyProject\target\generated-sources\xjc\my\classes\generated\Adapter1.java:[24,59] non-static method marshal(org.joda.time.LocalDate) cannot be referenced from a static context
Run Code Online (Sandbox Code Playgroud)

......这就是事情变得怪异的地方.JAXB生成一个包含以下内容的类Adapter1:

public class Adapter1
    extends XmlAdapter<String, LocalDate>
{


    public LocalDate unmarshal(String value) {
        return (my.classes.adapters.DateAdapter.unmarshal(value));
    }

    public String marshal(LocalDate value) {
        return (my.classes.adapters.DateAdapter.marshal(value));
    }

}
Run Code Online (Sandbox Code Playgroud)

....这是编译错误的来源.

现在,我的问题是:

  • 由于我的适配器覆盖XmlAdapter,我不能使方法静态....我该如何避免这种情况?
  • 我可以完全避免生成Adapter1.class吗?也许使用包级注释XmlJavaTypeAdapters,如果是这样,我该怎么做?(JAXB已经生成了自己的package-info.java ....)

希望我能说清楚我的情况.
谢谢

Syl*_*ain 17

我在WSDL的第一个上下文中:根本没有java,只是从提供的WSDL生成一个CXF客户端.

我被困在丑陋Adapter1.java的很长一段时间,但我找到了那里的解决方案.

您将使用已经解释过的自定义XMLAdapter.

这个问题的关键是将xjc扩展添加到全局绑定文件:

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
 xmlns:xs="http://www.w3.org/2001/XMLSchema" 
 xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
 jaxb:extensionBindingPrefixes="xjc" jaxb:version="2.1">
    <jaxb:globalBindings>
       <xjc:javaType adapter="com.xxx.tools.xjc.DateAdapter" 
        name="java.util.Date" xmlType="xs:dateTime" />
    </jaxb:globalBindings>
</jaxb:bindings>
Run Code Online (Sandbox Code Playgroud)

xjc扩展允许使用xjc:javaType该accept 接口参数.不再需要静态方法!

请注意,这似乎只适用于jaxb 2.1+.


Wil*_*leu 7

你不需要扩展XmlAdapter.

只需在POJO上创建静态方法即可.

例:

 public class DateAdapter {
    private static DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyyMMdd");

    public static LocalDate unmarshal(String v) throws Exception {
        return fmt.parseLocalDate(v);
    }

    public static String marshal(LocalDate v) throws Exception {
        return v.toString("yyyyMMdd");
    }
 }
Run Code Online (Sandbox Code Playgroud)