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)
....这是编译错误的来源.
现在,我的问题是:
希望我能说清楚我的情况.
谢谢
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+.
你不需要扩展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)
| 归档时间: |
|
| 查看次数: |
18780 次 |
| 最近记录: |