春季启动WS:无适配器端点

问题描述 投票:2回答:2

我试图以创建SOAP服务使用Spring启动WS,但我面对的异常“无适配器终点......”。

这里是我的XSD

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://nisws.it.fastweb"
           targetNamespace="http://nisws.it.fastweb" elementFormDefault="qualified">

    <xs:element name="doEventRequest" type="tns:doEventRequest"/>

    <xs:element name="doEventResponse" type="tns:doEventResponse"/>
    <xs:complexType name="doEventRequest">
        <xs:sequence>
            <xs:element name="header" type="tns:header"/>
            <xs:element name="trackingbody" type="tns:trackingbody"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="header">
        <xs:sequence>
            <xs:element name="IdMessaggio" type="xs:string"/>
            <xs:element name="NomeBE" type="xs:string"/>
            <xs:element name="DataInserimentoBE" type="xs:string"/>
            <xs:element name="Release" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="trackingbody">
        <xs:all>
            <xs:element name="Sorgente" type="xs:string"/>
            <xs:element name="Parametri" type="tns:Parametri" minOccurs="0"/>
            <xs:element name="Componenti" type="tns:Componenti" minOccurs="0"/>
        </xs:all>
    </xs:complexType>
    <xs:complexType name="Parametri">
        <xs:sequence>
            <xs:element name="Parametro" type="tns:TagParametro" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="TagParametro">
        <xs:sequence>
            <xs:element name="Descrizione" type="xs:string"/>
            <xs:element name="Valore" type="xs:string" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="Componenti">
        <xs:sequence>
            <xs:element name="Componente" type="tns:TagComponente" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="TagComponente">
        <xs:sequence>
            <xs:element name="ID" type="xs:string" minOccurs="0"/>
            <xs:element name="Descrizione" type="xs:string" minOccurs="0"/>
            <xs:element name="Tipo" type="xs:string"/>
            <xs:element name="Parametri" type="tns:Parametri"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="doEventResponse">
        <xs:sequence>
            <xs:element name="header" type="tns:header"/>
            <xs:element name="trackingbody" type="tns:trackingbody"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>

这里是servlet类

import org.springframework.boot.context.embedded.ServletRegistrationBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.ws.config.annotation.EnableWs;
import org.springframework.ws.config.annotation.WsConfigurerAdapter;
import org.springframework.ws.transport.http.MessageDispatcherServlet;
import org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition;
import org.springframework.xml.xsd.SimpleXsdSchema;
import org.springframework.xml.xsd.XsdSchema;

@EnableWs
@Configuration
public class WebServiceConfig {

    @Bean
    public ServletRegistrationBean messageDispatcherServlet(ApplicationContext applicationContext) {
        MessageDispatcherServlet servlet = new MessageDispatcherServlet();
        servlet.setApplicationContext(applicationContext);
        servlet.setTransformWsdlLocations(true);
        return new ServletRegistrationBean(servlet, "/nis/*");
    }

    @Bean(name = "nisDoEvent")
    public DefaultWsdl11Definition defaultWsdl11Definition(XsdSchema doEventSchema) {
        DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition();
        wsdl11Definition.setPortTypeName("nisDoEvent");
        wsdl11Definition.setLocationUri("/nis/ws");
        wsdl11Definition.setTargetNamespace("http://nisws.it.fastweb");
        wsdl11Definition.setSchema(doEventSchema);
//      wsdl11Definition.setRequestSuffix("doEvent");
        return wsdl11Definition;
    }

    @Bean (name = "doEventSchema")
    public XsdSchema doEventSchema() {
        return new SimpleXsdSchema(new ClassPathResource("doEventSchema.xsd"));
    }

}

这里是我的终点

@Endpoint
public class CompletaMigrBNGEndpoint {

    private static final String NAMESPACE_URI = "http://nisws.it.fastweb";

    private static final String EXAMPLE_NAMESPACE_URI = "http://spring.io/guides/gs-producing-web-service";

    private CountryRepository countryRepository;

    @Autowired
    public CompletaMigrBNGEndpoint(CountryRepository countryRepository) {
        this.countryRepository = countryRepository;
    }

    @PayloadRoot(namespace = NAMESPACE_URI, localPart = "doEventRequest")
    @ResponsePayload
    public DoEventResponse doEvent(@RequestPayload DoEventRequest request){
        DoEventResponse response = new DoEventResponse();
        response.setHeader(request.getHeader());
        response.setTrackingbody(request.getTrackingbody());
        return response;
    }

    @PayloadRoot(namespace = EXAMPLE_NAMESPACE_URI, localPart = "getCountryRequest")
    @ResponsePayload
    public GetCountryResponse getCountry(@RequestPayload GetCountryRequest request) {
        GetCountryResponse response = new GetCountryResponse();
        response.setCountry(countryRepository.findCountry(request.getName()));

        return response;
    }

正如你可以看到我也试图跟着导游“https://spring.io/guides/gs/producing-web-service/

并且提供的示例工作正常。

至于我自己的服务,我试图通过的soapUI调用它,我得到异常:

16:43:38.674 [http-nio-8080-exec-4] DEBUG o.s.w.s.server.SoapMessageDispatcher - Endpoint invocation resulted in exception - responding with Fault
java.lang.IllegalStateException: No adapter for endpoint [public org.hp.doEventSchema.DoEventResponse org.hp.resources.connection.soap.services.CompletaMigrBNGEndpoint.doEvent(org.hp.doEventSchema.DoEventRequest)]: Is your endpoint annotated with @Endpoint, or does it implement a supported interface like MessageHandler or PayloadEndpoint?
    at org.springframework.ws.server.MessageDispatcher.getEndpointAdapter(MessageDispatcher.java:302) [spring-ws-core-2.2.1.RELEASE.jar!/:2.2.1.RELEASE]
    at org.springframework.ws.server.MessageDispatcher.dispatch(MessageDispatcher.java:235) [spring-ws-core-2.2.1.RELEASE.jar!/:2.2.1.RELEASE]
    at org.springframework.ws.server.MessageDispatcher.receive(MessageDispatcher.java:176) [spring-ws-core-2.2.1.RELEASE.jar!/:2.2.1.RELEASE]

我认为,可能是我的错误是在XSD或端点的映射,但我不能修复它。

提前致谢

问候

java spring soap spring-boot spring-ws
2个回答
4
投票

我解决了使用的JAXBElement封装通过JAXB插件生成的我的请求/响应对象。这就是为什么我注意到,在这些类没有@XmlRootElement注释。

不管怎么说,还是要谢谢你

问候


0
投票

只是包装像下面的请求和响应用的JAXBElement

@PayloadRoot(namespace = NAMESPACE_URI, localPart = "doEventRequest")
    @ResponsePayload
    public JAXBElement< DoEventResponse > doEvent(@RequestPayload JAXBElement< DoEventRequest > request){}

我们可以通过调用像下面获取对象

DoEventRequest d = request.getValue();
© www.soinside.com 2019 - 2024. All rights reserved.