通过绑定文件指定@XmlJavaTypeAdapter类?

时间:2011-10-20 14:27:36

标签: jaxb xjc

我有第三方界面,提供与其API匹配的xsd文件。他们的一些映射不是Java,通常的布尔值为0& 1: - (

我想使用绑定文件为我的BooleanAdapter指定@XmlJavaTypeAdapter类,但到目前为止没有任何乐趣。

绑定文件:

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns="http://java.sun.com/xml/ns/jaxws"
    jaxb:extensionBindingPrefixes="xjc" jaxb:version="2.0">
    <jaxb:bindings schemaLocation="GetUserDetailsResponse.xsd" node="/xs:schema" >
        <jaxb:globalBindings underscoreBinding="asWordSeparator" >
            <jaxb:serializable uid="1" />
            <jaxb:javaType name="java.lang.Boolean" xmlType="xs:boolean"
printMethod="mumble.bindings.BooleanAdapter.marshall" 
parseMethod="mumble.bindings.BooleanAdapter.unmarshall" />
        </jaxb:globalBindings>
    </jaxb:bindings>
</jaxb:bindings>

因为我正在使用maven来自POM的相关位:

<strict>false</strict>
<extension>true</extension>
<verbose>true</verbose>
<enableWrapperStyle>false</enableWrapperStyle>
<enableAsyncMapping>false</enableAsyncMapping>

我切换了enableWrapperStyle而没有改变

我最终得到的是生成的错误类型的适配器:

import javax.xml.bind.annotation.adapters.XmlAdapter;
public class Adapter1
    extends XmlAdapter<String, Boolean>{
    public Boolean unmarshal(String value) {
        return (mumble.bindings.BooleanAdapter.unmarshall(value));
    }

    public String marshal(Boolean value) {
        return (mumble.bindings.BooleanAdapter.marshall(value));
    }
}

是否有一些绑定文件魔法可以用来摆脱生成的包装并直接使用BooleanAdapter?

2 个答案:

答案 0 :(得分:10)

您需要在绑定配置中使用<xjc:javaType>而不是<jaxb:javaType>。 例如:

<xjc:javaType name="java.lang.Boolean" xmlType="xs:boolean"
              adapter="mumble.bindings.BooleanAdapter"/>

我知道我正在回答一个老问题,但我没有足够的声誉来撰写评论。

答案 1 :(得分:3)

这是一个超级迟到的反应,我意识到,但即使mvv的反应让我难以完全掌握我正在做的事情以及新元素在结构中的位置,所以我想添加对于之后遇到这种情况的人来说,还有一些进一步的细节。

根据mvv,最简单的答案是更改为使用xjc:javaType。有关使用xjc:javaType的详细文档,请参阅jaxb customization

您还需要更改自定义适配器(BooleanAdapter)以实现XmlAdapter接口。

最终,你的绑定会是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns="http://java.sun.com/xml/ns/jaxws"
    jaxb:extensionBindingPrefixes="xjc" jaxb:version="2.0">
    <jaxb:bindings schemaLocation="GetUserDetailsResponse.xsd" node="/xs:schema" >
        <jaxb:globalBindings underscoreBinding="asWordSeparator" >
            <jaxb:serializable uid="1" />
            <xjc:javaType name="java.lang.Boolean" xmlType="xs:boolean"
                  adapter="mumble.bindings.BooleanAdapter" />
        </jaxb:globalBindings>
    </jaxb:bindings>
</jaxb:bindings>