org.springframework.oxm.UncategorizedMappingException:使用 Spring WebserviceTemplate 的未知 JAXB 异常
org.springframework.oxm.UncategorizedMappingException: Unknown JAXB exception using Spring WebserviceTemplate
有一个基于 Java 的应用程序使用不同的 maven 项目连接到不同的 web 服务,应用程序已经有一个现有的 maven 项目(比如 project1),它使用 webServiceTemplate 调用基于 SOAP 的服务并获得响应。
我现在有一个新的要求,要为不同的服务创建另一个类似的项目,但需要使用 wsse 安全 headers。我创建了一个新的 Maven 项目并使用 webServiceTemplate 实现调用了该服务。
这两个项目在独立时都可以正常工作,但是当组合在一起时出现以下异常
org.springframework.oxm.UncategorizedMappingException: Unknown JAXB exception; nested exception is javax.xml.bind.JAXBException: class org.com.project1.cm.CreateRequest nor any of its super class is known to this context..)
Spring服务上下文xml如下
<bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">
<property name="messageSender">
<bean class="org.springframework.ws.transport.http.HttpComponentsMessageSender">
<property name="credentials" ref="credentialProvider" />
<property name="authScope" ref="authScope" />
<property name="httpClient" ref="httpClient" />
</bean>
</property>
<property name="defaultUri" value="${myproject.endpoint.url}"/>
<property name="marshaller" ref="marshaller" />
<property name="unmarshaller" ref="unMarshaller" />
<property name="interceptors">
<list>
<bean
class="org.com.project1.cm.SoapLoggingInterceptor" >
</bean>
</list>
</property>
</bean>
<oxm:jaxb2-marshaller id="marshaller" contextPath="org.com.project1.cm"/>
<oxm:jaxb2-marshaller id="unMarshaller" contextPath="org.com.project1.cm" />
另一个项目使用类似的 Spring 上下文 xml 只有 jaxb2-marshaller 具有新服务的上下文路径
在两个项目 Impl 中使用以下代码完成服务调用 class
public AttendenceResponse getAttendenceDetails(AttendenceRequest request) {
try {
MyData myData = AttendenceRequestMapper.getInstance().map(request.getPayload());
AttendenceResponse aResponse = (AttendenceResponse) webServiceTemplate.marshalSendAndReceive(webServiceTemplate.getDefaultUri(), myData);
return AttendenceResponseMapper.getInstance().map(aResponse.getMyDataResult());
} catch (Exception e) {
throw se;
}
}
对于项目 2,我必须添加 wsse 安全性 headers,因此在 pom.xml
中添加了以下 jars
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-security</artifactId>
<version>2.3.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
你能指导我解决这个问题吗?
问题在于 Web 服务模板的 Spring 服务上下文 xml 项目,编组器和解组器具有相同的 bean 名称。提供唯一的 bean 名称解决了问题
有一个基于 Java 的应用程序使用不同的 maven 项目连接到不同的 web 服务,应用程序已经有一个现有的 maven 项目(比如 project1),它使用 webServiceTemplate 调用基于 SOAP 的服务并获得响应。
我现在有一个新的要求,要为不同的服务创建另一个类似的项目,但需要使用 wsse 安全 headers。我创建了一个新的 Maven 项目并使用 webServiceTemplate 实现调用了该服务。
这两个项目在独立时都可以正常工作,但是当组合在一起时出现以下异常
org.springframework.oxm.UncategorizedMappingException: Unknown JAXB exception; nested exception is javax.xml.bind.JAXBException: class org.com.project1.cm.CreateRequest nor any of its super class is known to this context..)
Spring服务上下文xml如下
<bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">
<property name="messageSender">
<bean class="org.springframework.ws.transport.http.HttpComponentsMessageSender">
<property name="credentials" ref="credentialProvider" />
<property name="authScope" ref="authScope" />
<property name="httpClient" ref="httpClient" />
</bean>
</property>
<property name="defaultUri" value="${myproject.endpoint.url}"/>
<property name="marshaller" ref="marshaller" />
<property name="unmarshaller" ref="unMarshaller" />
<property name="interceptors">
<list>
<bean
class="org.com.project1.cm.SoapLoggingInterceptor" >
</bean>
</list>
</property>
</bean>
<oxm:jaxb2-marshaller id="marshaller" contextPath="org.com.project1.cm"/>
<oxm:jaxb2-marshaller id="unMarshaller" contextPath="org.com.project1.cm" />
另一个项目使用类似的 Spring 上下文 xml 只有 jaxb2-marshaller 具有新服务的上下文路径
在两个项目 Impl 中使用以下代码完成服务调用 class
public AttendenceResponse getAttendenceDetails(AttendenceRequest request) {
try {
MyData myData = AttendenceRequestMapper.getInstance().map(request.getPayload());
AttendenceResponse aResponse = (AttendenceResponse) webServiceTemplate.marshalSendAndReceive(webServiceTemplate.getDefaultUri(), myData);
return AttendenceResponseMapper.getInstance().map(aResponse.getMyDataResult());
} catch (Exception e) {
throw se;
}
}
对于项目 2,我必须添加 wsse 安全性 headers,因此在 pom.xml
中添加了以下 jars<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-security</artifactId>
<version>2.3.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
你能指导我解决这个问题吗?
问题在于 Web 服务模板的 Spring 服务上下文 xml 项目,编组器和解组器具有相同的 bean 名称。提供唯一的 bean 名称解决了问题