首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在maven-jaxb2-plugin中插入自定义setter

在maven-jaxb2-plugin中插入自定义setter
EN

Stack Overflow用户
提问于 2011-09-07 06:46:51
回答 4查看 3.3K关注 0票数 3

我使用Jvnet.jaxb2.maven 2:maven-jaxb2-plugin从XSD模式文件中创建POJO。

现在,我想插入一些类似自定义设置器的内容。它应该修剪所有字符串,并删除某些字符。

你知道怎么做吗?

XJB文件:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings version="2.0" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc">
    <jaxb:bindings schemaLocation="my-schema-xml4.xsd" node="/xs:schema">
        <xjc:javaType name="java.lang.String" adapter="my.StringAdapter" />
    </jaxb:bindings>
</jaxb:bindings>

绑定Java类型的解决方案:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" ?>
<bindings version="2.0" xmlns="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">
    <bindings schemaLocation="mySchema-xml4.xsd" node="/xs:schema">
        <globalBindings>
            <xjc:javaType name="java.lang.String" xmlType="xs:string"
                adapter="com.name.MyAdapter" />
                    <xjc:javaType name="java.lang.String" xmlType="xs:anySimpleType"
                adapter="com.name.MyAdapter" />
        </globalBindings>
    </bindings>
</bindings>

但是,在具有混合内容的节点中,@XmlJavaTypeAdapter仍然没有添加到content属性中,尽管该属性具有java.lang.String类型。

EN

回答 4

Stack Overflow用户

发布于 2011-09-07 09:08:11

我认为实现这一点的最好方法是实现自己的XmlAdapter,并通过属性定制来配置它。您可以使用标准的jaxb:property自定义或使用注释插件来实现这一点。

jaxb:property

代码语言:javascript
复制
  <jaxb:property>
    <jaxb:baseType>
      <xjc:javaType name="java.lang.String"
        adapter="com.acme.foo.MyAdapter"/>
    </jaxb:baseType>
  </jaxb:property>

注释插件:

代码语言:javascript
复制
  <annox:annotate target="field">
    <annox:annotate
      annox:class="javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter"
      value="com.acme.foo.MyAdapter"/>
  </annox:annotate>

参见这里的示例项目:

https://svn.java.net/svn/jaxb2-commons~svn/basics/trunk/tests/one/

票数 1
EN

Stack Overflow用户

发布于 2011-09-10 18:55:40

如果您的XSD将来不会改变,只需生成POJO,请注释掉JAXB插件并手动修改源代码。

如果您的XSD很少更改,您仍然可以在版本控制系统中使用此解决方案。提交生成的源代码,修改POJO并提交修改。下一次修改XSD时,在两个提交之间生成一个修补程序,从新的XSD生成POJO并应用该修补程序。在XSD几乎从不改变的情况下,我发现这个解决方案要简单得多。

票数 0
EN

Stack Overflow用户

发布于 2011-09-12 13:26:36

另一种方法是在JAXB实现接收到StAX文本之前使用StreamReaderDelegate来操作它。

Demo

您的代码如下所示。您可以实现一个StreamReaderDelegate来操作文本事件返回的文本:

代码语言:javascript
复制
package forum7329881;

import java.io.FileInputStream;
import javax.xml.bind.*;
import javax.xml.stream.*;
import javax.xml.stream.util.StreamReaderDelegate;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Customer.class);

        XMLInputFactory xif = XMLInputFactory.newInstance();
        XMLStreamReader xsr = xif.createXMLStreamReader(new FileInputStream("src/forum7329881/input.xml"));
        xsr = new MyStreamReaderDelegate(xsr);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Customer customer = (Customer) unmarshaller.unmarshal(xsr);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(customer, System.out);
    }

    private static class MyStreamReaderDelegate extends StreamReaderDelegate {

        public MyStreamReaderDelegate(XMLStreamReader xsr) {
            super(xsr);
        }


        @Override
        public String getText() {
            return super.getText().trim();
        }

        @Override
        public char[] getTextCharacters() {
            return getText().toCharArray();
        }

        @Override
        public int getTextLength() {
            return getText().length();
        }

        @Override
        public int getTextStart() {
            return 0;
        }

    }

}

input.xml

下面是包含文本节点中空白的示例输入:

代码语言:javascript
复制
<customer Id="1">
    <name>    Jane Doe    </name>
    <address>
        <street>    123 A Street    </street>
    </address>
</customer>

输出

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer>
    <address>
        <street>123 A Street A</street>
    </address>
    <name>Jane Doe</name>
</customer>

客户

代码语言:javascript
复制
package forum7329881;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Customer {

    private String name;
    private Address address;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

}

地址

代码语言:javascript
复制
package forum7329881;

public class Address {

    private String street;

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

}

获取更多信息

下面的链接指向一个更详细的示例,其中我使用StAX StreamReaderDelegate支持不区分大小写的解组:

  • http://blog.bdoughan.com/2010/12/case-insensitive-unmarshalling.html
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7329881

复制
相关文章

相似问题

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