javax.xml.bind.JAXBException: не содержит ObjectFactory.class или jaxb.index
У меня есть веб-приложение Java Spring, которое мне нужно использовать в качестве клиента SOAP.
Я использую Maven, и у меня есть основной модуль (WAR) с моим пользовательским кодом и дочерний модуль (зависимость JAR) с сгенерированными классами WSDL (у меня два WSDL).
Как видно из названия, когда я запускаю приложение, возникает ошибка
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
Ошибка возникает во время бина маршаллера:
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 ответ
Хорошо, я решил изменить определение бина Marshaller следующим образом:
<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 к пакетам ToScan