Spring WS + JIBX "No adapter for endpoint" Error
Asked Answered
J

2

0

I use JIBX to create my entity classes from XSD files. It is configured in pom.xml and creates classes when I do a "maven: compile"

I also use spring-ws. When I test my web service with SOAPUI I get the infamous error;

"No adapter for endpoint GetTransactionsResponse getTransactions(GetTransactionsRequest),  Is your endpoint annotated with @Endpoint, or does.." 

I checked all the threads here about that error but didn't help.

I have one Parent.xsd and it imports 2 child xsd's. They are all in the same folder. This is how my spring-ws-servlet looks like;

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

This is my endpoint class;

@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/Request classes created by JIBX.

My wsdl looks like this;

 <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 file is;

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

I am not sure if the problem is because there are 3 xsd files and something goes wrong between those or it is a configuration problem with JIBX because When I try to use JAXB instead of JIBX, it worked!

Jonejonell answered 26/9, 2013 at 15:45 Comment(1)
did you try using soapAction instead of PayloadRoot (for ex SoapAction("nmapespace/getTransactionsRequest") ?Vocal
F
0

Endpoint mappings are stored in a hashmap with a key based on the namespace and the local part of the @PayloadRoot annotation (see code below). You currently have (what I assume is) a typo in the namespace of the java class... nmapespace instead of namespace.

If this does not match up with what is located in your xsd and subsequently published wsdl (which are not shown), then the mapping would not be found. This is one (of the many) possible reasons that you would get that error.

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;
    }
}

If this is not the problem, you may need to add some more info to the question (soap request, xsds, wsdl).

Fording answered 27/9, 2013 at 2:6 Comment(1)
@Jonejonell but the problem might be in the parts you did not display. Namespace being one of them. Are you able to access the wsdl from the server ?Fording
V
0

I also had similar issue(spent several days) however in my case issue being Spring WS and Spring versions being incompatible, check whether your Spring WS and Spring versions match.

Venlo answered 27/9, 2013 at 10:48 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.