首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JAXB XmlAdapter通过绑定文件

JAXB XmlAdapter通过绑定文件
EN

Stack Overflow用户
提问于 2015-08-16 18:50:16
回答 1查看 2.5K关注 0票数 1

考虑一下这个XSD:

代码语言:javascript
复制
<xsd:schema targetNamespace="http://foobar" xmlns:tns="http://foobar"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">

    <xsd:complexType name="IdAttribute">
        <xsd:attribute name="id" type="xsd:token" />
    </xsd:complexType>

    <xsd:complexType name="FoobarType">
        <xsd:sequence>
            <xsd:element name="someIds" type="tns:IdAttribute" maxOccurs="unbounded" />
        </xsd:sequence>
    </xsd:complexType>

    <xsd:element name="Foobar" type="tns:FoobarType" />
</xsd:schema>

生成的Java类如下:

代码语言:javascript
复制
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "FoobarType", propOrder = {"someIds"})
public class FoobarType {

    @XmlElement(required = true)
    protected List<IdAttribute> someIds;

    // ...
}

因为IdAttribute只包含一个字符串(id),为了便于使用,我希望将这些字符串直接映射到我的FoobarType中。因此我写了一个XmlAdapter

代码语言:javascript
复制
public class IdAttributeAdapter extends XmlAdapter<IdAttribute, String> { ... }

我手动编辑了生成的类,以验证我的XmlAdapter按预期工作(它确实如此):

代码语言:javascript
复制
@XmlElement(required = true)
@XmlJavaTypeAdapter(IdAttributeAdapter.class)
protected List<String> someIds;

当然,我希望在代码生成过程中完成这个小小的代码更改,因此我添加了以下绑定文件(src/main/xjb/bindings.xjb):

尝试1:

代码语言:javascript
复制
<jaxb:bindings version="2.0" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd">

    <jaxb:bindings schemaLocation="../resources/xsd/foobar.xsd">
        <jaxb:bindings node="//xsd:complexType[@name='IdAttribute']">
            <xjc:javaType
                name="java.lang.String"
                adapter="org.foobar.IdAttributeAdapter" />
        </jaxb:bindings>
    </jaxb:bindings>

</jaxb:bindings>

结果

代码语言:javascript
复制
com.sun.istack.SAXParseException2; systemId: file:/C:/dev/foobar/src/main/xjb/bindings.xjb;
lineNumber: 12; columnNumber: 91;
compiler was unable to honor this conversion customization. It is attached to a wrong place, or its inconsistent with other bindings.

尝试2(来自这里):

代码语言:javascript
复制
<jaxb:globalBindings xmlns:foo="http://foobar" xsi:schemaLocation="http://foobar ../resources/xsd/foobar.xsd">
    <xjc:javaType
        name="java.lang.String"
        xmlType="foo:IdAttribute"
        adapter="org.foobar.IdAttributeAdapter" />
</jaxb:globalBindings>

结果

代码语言:javascript
复制
com.sun.istack.SAXParseException2; systemId: file:/C:/dev/projects/luna/oasch/src/main/xjb/bindings.xjb;
lineNumber: 8; columnNumber: 112;
undefined simple type "{http://foobar}IdAttribute".

我尝试过几种不同的方法,但它们都导致了类似的错误。那么,使用绑定文件添加XmlApender的正确方法是什么?

EN

回答 1

Stack Overflow用户

发布于 2015-08-26 09:47:17

你想做的事是错的。您应该将xml类型IdAttribute完全替换为java类型字符串。

您必须使用泛型dom.Element类型并将其转换为<->字符串。下面是一个示例:用于任意XML的JAXB @XmlAdapter用于您的情况,将java类型的Bar替换为String。

其他解决方案是向生成的类添加行为,以便将方法添加到FoobarType中,使其工作起来就像它有一个字符串列表一样。

例如添加方法

List<String> getIds()

void setIds(List<String>)

下面是一个解释如何做到这一点的链接:“添加行为”

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32038713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档