我正在使用org.jvnet.jaxb2.maven2:maven-jaxb2-plugin从XSD架构文件创建POJO。
现在我要插入类似自定义setter的内容。它应修剪所有字符串,并应删除某些字符。
你知道怎么做吗?
XJB文件:
<?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类型的解决方案:
<?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
。
答案 0 :(得分:1)
我认为实现这一目标的最佳方法是实现自己的XmlAdapter并通过属性自定义进行配置。
您可以使用标准jaxb:property
自定义或使用annotate plugin。
jaxb:property
:
<jaxb:property>
<jaxb:baseType>
<xjc:javaType name="java.lang.String"
adapter="com.acme.foo.MyAdapter"/>
</jaxb:baseType>
</jaxb:property>
注释插件:
<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 :(得分:0)
如果您的XSD将来不会更改,只需生成POJO,注释掉JAXB插件并手动修改源代码。
如果您的XSD很少更改 ,您仍然可以将此解决方案与版本控制系统一起使用。提交生成的源,修改POJO并提交修改。下次修改XSD时,在两次提交之间生成补丁,从新的XSD生成POJO并应用补丁。在XSD几乎不会发生变化的情况下,我发现这个解决方案要简单得多。
答案 2 :(得分:0)
另一种方法是使用StAX StreamReaderDelegate
在JAXB实现收到XML文本之前对其进行操作。
<强>演示强>
您的代码如下所示。您将实现StreamReaderDelegate
来操作从文本事件返回的文本:
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中强>
下面是包含文本节点中空格的示例输入:
<customer Id="1">
<name> Jane Doe </name>
<address>
<street> 123 A Street </street>
</address>
</customer>
<强>输出强>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer>
<address>
<street>123 A Street A</street>
</address>
<name>Jane Doe</name>
</customer>
<强>客户强>
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;
}
}
<强>地址强>
package forum7329881;
public class Address {
private String street;
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
}
了解更多信息
下面是一个更详细示例的链接,我使用StAX StreamReaderDelegate
来支持不区分大小写的解组:
答案 3 :(得分:0)
在我看来,你应该使用AOP, 例如,选择Spring AOP,截取适配器方法以获得修剪/剥离逻辑。实际上,现在这可以是适用于所有字符串类型的通用逻辑。 如果这听起来令人信服,我可以进一步帮助代码