Xsd 如何强制生成@XmlSeeAllow注释?
我正在使用JAXB从几个XSD文件生成Java代码。然后,在OSGi容器中,我将XML文件解组到生成的代码中。XSD使用XSD:any元素:Xsd 如何强制生成@XmlSeeAllow注释?,xsd,jaxb,Xsd,Jaxb,我正在使用JAXB从几个XSD文件生成Java代码。然后,在OSGi容器中,我将XML文件解组到生成的代码中。XSD使用XSD:any元素: <xsd:complexType name="GetReservationRSType"> <xsd:sequence> <xsd:element name="Errors" type="pnrb:Errors.PNRB" minOccurs="0" />
<xsd:complexType name="GetReservationRSType">
<xsd:sequence>
<xsd:element name="Errors" type="pnrb:Errors.PNRB"
minOccurs="0" />
<xsd:choice>
<xsd:element name="Reservation" type="pnrb:Reservation.PNRB"
minOccurs="0" />
<xsd:element name="Content" minOccurs="0">
<xsd:complexType>
<xsd:choice>
<xsd:any processContents="lax" />
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:sequence>
</xsd:complexType>
有没有办法强迫JAXB自动添加这样的注释?例如,通过添加一些JAXB绑定配置选项或修改XSD文件
编辑:
OSGi env中的我的JAXBContext是通过以下方式初始化的(它获取所有生成的包名作为参数)-它们与冒号分隔符的用法一起列出,正如在一些与JAXB相关的文章中所建议的那样:
<bean id="jaxbContext" class="javax.xml.bind.JAXBContext" factory-method="newInstance">
<constructor-arg index="0" value="com.sabre.webservices.pnrbuilder:com.sabre.webservices.sabrexml._2003._07" />
</bean>
您应该在生成的包名上创建
JAXBContext
,而不是试图强制输入@xmlseea
注释。通过这种方式,您可以确保所有类都已处理。由于您处于OSGi环境中,因此可以使用其中一种方法来获取ClassLoader
参数
JAXBContext jc = JAXBContext.newInstance("com.example.foo", ObjectFactory.class.getClassLoader());
如果有多个生成的包名,则上下文路径是分隔的
JAXBContext jc = JAXBContext.newInstance("com.example.foo:org.example.bar", ObjectFactory.class.getClassLoader());
我找到了一个令人满意的解决办法。它使用。也许这不是一个完美的解决方案,但至少它阻止了我将生成的类提交到SVN存储库中。 提到的插件只是添加了想要的注释 以下是pom.xml中所需的配置:
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<executions>
<execution>
<id>schema-pnr-service</id>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<schemaDirectory>src/main/resources/xsd</schemaDirectory>
<schemaIncludes>
<include>GetReservationSTLRQ_v0.01.xsd</include>
<include>GetReservationSTLRS_v0.01.xsd</include>
<include>OTA_TravelItineraryReadCDI1.0.5RQ.xsd</include>
<include>OTA_TravelItineraryReadCDI1.0.5RQRS.xsd</include>
<include>OTA_TravelItineraryReadCDI1.0.5RS.xsd</include>
<include>OTA_TravelItineraryReadPNR1.0.5RS.xsd</include>
</schemaIncludes>
<extension>true</extension>
<args>
<arg>-Xannotate</arg>
<arg>-Xannotate-defaultFieldTarget=setter</arg>
</args>
<plugins>
<plugin>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics-annotate</artifactId>
</plugin>
</plugins>
</configuration>
</execution>
</executions>
</plugin>
org.jvnet.jaxb2.maven2
maven-jaxb2-plugin
模式pnr服务
生成
src/main/resources/xsd
GetReservationSTLRQ_v0.01.xsd
GetReservationSTLRS_v0.01.xsd
OTA_TravelTineraryReadCDI1.0.5RQ.xsd
OTA_TravelTineraryReadCDI1.0.5RQRS.xsd
OTA_TravelTineraryReadCDI1.0.5RS.xsd
OTA_TravelTineraryReadPNR1.0.5RS.xsd
真的
-山奈特
-Xannotate defaultFieldTarget=setter
org.jvnet.jaxb2_commons
jaxb2基础注释
所需的注释在bindings.xjb文件中配置,该文件应与*.xsd文件位于同一目录中-其内容如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<bindings xmlns="http://java.sun.com/xml/ns/jaxb"
xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd"
xmlns:annox="http://annox.dev.java.net"
extensionBindingPrefixes="annox" version="2.1">
<globalBindings typesafeEnumMaxMembers="600"/>
<bindings schemaLocation="GetReservationSTLRS_v0.01.xsd" node="/xsd:schema">
<bindings node="xsd:complexType[@name='GetReservationRSType']/xsd:sequence/xsd:choice/xsd:element[@name='Content']/xsd:complexType">
<annox:annotate target="class">
<annox:annotate annox:class="javax.xml.bind.annotation.XmlSeeAlso" value="com.sabre.webservices.sabrexml._2003._07.OTATravelItineraryRS" />
</annox:annotate>
</bindings>
</bindings>
</bindings>
AFAIK jaxb在模式中有扩展时也会生成@xmlsee。ClassLoader
参数非常重要。您发布了什么类型的配置文件?这是标准的springbeans.xml文件。jaxbcontextbean然后被注入到另一个实际上负责解组的bean中。@LukaszBaran-我似乎找不到允许您指定类加载器的Spring属性。我怀疑Spring在创建JAXBContext
时没有包含一个。相反,您可以在Springs要绑定的类列表中包含要引用的类。@xmlseea
。好吧,我刚刚尝试完全按照您的建议在Java代码中初始化JaxbContext-不幸的是,我一直得到相同的异常。@LukaszBaran-听起来这更像是Spring的问题,而不是JAXB的问题。
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<executions>
<execution>
<id>schema-pnr-service</id>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<schemaDirectory>src/main/resources/xsd</schemaDirectory>
<schemaIncludes>
<include>GetReservationSTLRQ_v0.01.xsd</include>
<include>GetReservationSTLRS_v0.01.xsd</include>
<include>OTA_TravelItineraryReadCDI1.0.5RQ.xsd</include>
<include>OTA_TravelItineraryReadCDI1.0.5RQRS.xsd</include>
<include>OTA_TravelItineraryReadCDI1.0.5RS.xsd</include>
<include>OTA_TravelItineraryReadPNR1.0.5RS.xsd</include>
</schemaIncludes>
<extension>true</extension>
<args>
<arg>-Xannotate</arg>
<arg>-Xannotate-defaultFieldTarget=setter</arg>
</args>
<plugins>
<plugin>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics-annotate</artifactId>
</plugin>
</plugins>
</configuration>
</execution>
</executions>
</plugin>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<bindings xmlns="http://java.sun.com/xml/ns/jaxb"
xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd"
xmlns:annox="http://annox.dev.java.net"
extensionBindingPrefixes="annox" version="2.1">
<globalBindings typesafeEnumMaxMembers="600"/>
<bindings schemaLocation="GetReservationSTLRS_v0.01.xsd" node="/xsd:schema">
<bindings node="xsd:complexType[@name='GetReservationRSType']/xsd:sequence/xsd:choice/xsd:element[@name='Content']/xsd:complexType">
<annox:annotate target="class">
<annox:annotate annox:class="javax.xml.bind.annotation.XmlSeeAlso" value="com.sabre.webservices.sabrexml._2003._07.OTATravelItineraryRS" />
</annox:annotate>
</bindings>
</bindings>
</bindings>