Xsd 如何强制生成@XmlSeeAllow注释?

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" />

我正在使用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: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>