javax.xml.bind.JAXBException:不包含ObjectFactory.class或jaxb.in​​dex

时间:2018-08-23 09:30:05

标签: java maven soap jaxb spring-ws

我有一个Java Spring Web应用程序,需要用作SOAP客户端。

我正在使用Maven,并且具有一个包含自定义代码的主模块(WAR)和一个具有WSDL(我有两个WSDL)生成的类的子模块(JAR依赖项)。

运行应用程序时,您会在标题中看到

javax.xml.bind.JAXBException: doesn't contain ObjectFactory.class or jaxb.index

这是主模块的ApplicationContext.xml:

<bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory"/>

    <bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">
        <constructor-arg ref="messageFactory"/>
        <property name="marshaller" ref="marshaller" />
        <property name="unmarshaller" ref="marshaller" />          
        <property name="interceptors">
            <list>
                <ref bean="wsSecurityInterceptor" />
            </list>
        </property>
    </bean>

    <bean id="wsSecurityInterceptor" class="org.springframework.ws.soap.security.wss4j2.Wss4jSecurityInterceptor">
        <property name="securementActions" value="UsernameToken" />
        <property name="securementUsername" value="xxx" />
        <property name="securementPassword" value="xxxx" />
        <property name="securementPasswordType" value="PasswordText" />
    </bean>

    <bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">        
        <property name="contextPaths">
            <list value-type="java.lang.String">
                <value>my.package.path.wsdl</value>                
                <value>my.package.path.wsdlserver</value>
            </list>
        </property>
    </bean>

正确地生成WSDL类到子模块中,并且每个包中都有两个ObjectFactory.class:

my.package.path.wsdl
my.package.path.wsdlserver

在Marshaller Bean期间引发错误:

    Error creating bean with name 'marshaller' defined in ServletContext resource
...
javax.xml.bind.JAXBException: "my.package.path.wsdl" doesn't contains ObjectFactory.class or jaxb.index

我已经找到了有关此问题的多个线索,但由于存在ObjectFactory.class(由maven-jaxb2-plugin自动创建),因此我无法理解该问题。

预先感谢您的支持,对不起我的英语。

1 个答案:

答案 0 :(得分:3)

好吧,我解决了以这种方式更改Marshaller Bean定义的问题:

<bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
    <property name="packagesToScan">
      <list>
         <value>my.package.path.wsdl</value>                
         <value>my.package.path.wsdlserver</value>
      </list>
    </property>
</bean>

我需要从 contextPaths 属性转到 packagesToScan