我使用 JIBX 从XSD文件创建实体类。它在pom.xml中配置,并在我执行“maven:compile”
时创建类我也使用spring-ws。当我使用SOAPUI测试我的Web服务时,我得到了臭名昭着的错误;
"No adapter for endpoint GetTransactionsResponse getTransactions(GetTransactionsRequest), Is your endpoint annotated with @Endpoint, or does.."
我在这里查看了有关该错误的所有主题,但没有帮助。
我有一个Parent.xsd并导入2个子xsd。它们都在同一个文件夹中。这就是我的spring-ws-servlet的样子;
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:sws="http://www.springframework.org/schema/web-services"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/web-services http://www.springframework.org/schema/web-services/web-services-2.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<bean name="xsdCollection" class="org.springframework.xml.xsd.commons.CommonsXsdSchemaCollection">
<property name="xsds">
<list>
<value>/WEB-INF/Parent.xsd</value>
</list>
</property>
</bean>
<context:component-scan base-package="mypackage"/>
<sws:annotation-driven/>
<sws:dynamic-wsdl id="my" portTypeName="myResource" locationUri="/ws/my"
targetNamespace="myschame">
<sws:xsd location="/WEB-INF/Parent.xsd"/>
</sws:dynamic-wsdl>
<sws:interceptors>
<bean class="org.springframework.ws.soap.server.endpoint.interceptor.SoapEnvelopeLoggingInterceptor">
<property name="logRequest" value="true"/>
<property name="logResponse" value="true"/>
</bean>
<bean class="org.springframework.ws.soap.server.endpoint.interceptor.PayloadValidatingInterceptor">
<property name="xsdSchemaCollection" ref="xsdCollection"/>
<property name="validateRequest" value="true"/>
<property name="validateResponse" value="true"/>
</bean>
</sws:interceptors>
这是我的端点类;
@Endpoint
public class TransactionsEndpoint {
public static final String NAMESPACE = "nmapespace";
@PayloadRoot(namespace = NAMESPACE, localPart = "getTransactionsRequest")
@ResponsePayload
public GetTransactionsResponse getTransactions(@RequestPayload GetTransactionsRequest request) {
GetTransactionsResponse transactionsResponse = new GetTransactionsResponse();
return transactionsResponse;
}
}
GetTransactionsResponse /由JIBX创建的请求类。
我的wsdl看起来像这样;
<wsdl:operation name="getTransactions"><wsdl:input message="tns:getTransactionsRequest" name="getTransactionsRequest">
</wsdl:input><wsdl:output message="tns:getTransactionsResponse" name="getTransactionsResponse">
</wsdl:output></wsdl:operation>
pom文件是;
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-core</artifactId>
</dependency>
<dependency>
<groupId>org.apache.ws.xmlschema</groupId>
<artifactId>xmlschema-core</artifactId>
<version>2.0.2</version>
</dependency>
我不确定问题是否因为有3个xsd文件而且这些文件之间出现了问题,或者这是JIBX的配置问题,因为当我尝试使用JAXB代替JIBX时,它有效!
答案 0 :(得分:0)
端点映射存储在散列映射中,其中包含基于命名空间和@PayloadRoot批注的本地部分的键(请参阅下面的代码)。您目前(我假设是)java类的命名空间中的拼写错误... nmapespace而不是命名空间。
如果这与xsd和随后发布的wsdl(未显示)中的内容不匹配,则无法找到映射。这是你可能会遇到错误的一个(众多)可能的原因。
public class PayloadRootAnnotationMethodEndpointMapping extends
AbstractAnnotationMethodEndpointMapping<QName> {
...
@Override
protected QName getLookupKeyForMethod(Method method) {
PayloadRoot annotation = AnnotationUtils.findAnnotation(method, PayloadRoot.class);
if (annotation != null) {
QName qname;
if (StringUtils.hasLength(annotation.localPart()) && StringUtils.hasLength(annotation.namespace())) {
qname = new QName(annotation.namespace(), annotation.localPart());
}
else {
qname = new QName(annotation.localPart());
}
return qname;
}
else {
return null;
}
}
如果这不是问题,您可能需要在问题中添加更多信息(soap request,xsds,wsdl)。
答案 1 :(得分:0)
我也有类似的问题(花了好几天)但是在我的案例中,Spring WS和Spring版本是不兼容的,请检查你的Spring WS和Spring版本是否匹配。