Spring ws:端点没有适配器

时间:2013-11-29 16:28:12

标签: spring web-services spring-ws

我正在尝试从这个tutorial创建一个示例项目,并在tomcat-6.0.14上运行服务器端项目,但是当我尝试使用以下xml的SoapUI调用web服务时:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sch="http://mycompany.com/hr/schemas">
<soapenv:Header/>
<soapenv:Body>
  <sch:HolidayRequest>
     <!--You may enter the following 2 items in any order-->
     <sch:Holiday>
        <sch:StartDate>2006-07-03</sch:StartDate>
        <sch:EndDate>2006-07-03</sch:EndDate>
     </sch:Holiday>
     <sch:Employee>
        <sch:Number>42</sch:Number>
        <sch:FirstName>Kevin</sch:FirstName>
        <sch:LastName>Garnett</sch:LastName>
     </sch:Employee>
  </sch:HolidayRequest>
</soapenv:Body>
</soapenv:Envelope>

返回xml是:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
  <SOAP-ENV:Fault>
     <faultcode>SOAP-ENV:Server</faultcode>
     <faultstring xml:lang="en">No adapter for endpoint [public void com.mycompany.hr.ws.HolidayEndpoint.handleHolidayRequest(org.jdom.Element) throws java.lang.Exception]: Is your endpoint annotated with @Endpoint, or does it implement a supported interface like MessageHandler or PayloadEndpoint?</faultstring>
  </SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

为什么会出现端点适配器?我用谷歌搜索,但没有找到根本原因。有人可以提供一些帮助吗?

以下是我的代码和配置:

的pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ilovekg.learn.breadth</groupId>
<artifactId>Breadth_WebService_SpringWS</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>Breadth_WebService_SpringWS Spring-WS Application</name>
<url>http://www.springframework.org/spring-ws</url>
<build>
    <finalName>Breadth_WebService_SpringWS</finalName>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.5</source>
                <target>1.5</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>tomcat-maven-plugin</artifactId>
            <version>1.1</version>
        </plugin>
    </plugins>
</build>
<dependencies>
    <dependency>
    <groupId>org.springframework.ws</groupId>
    <artifactId>spring-ws-core</artifactId>
    <version>2.1.4.RELEASE</version>
</dependency>
<dependency>
    <groupId>jaxen</groupId>
    <artifactId>jaxen</artifactId>
    <version>1.1</version>
</dependency>
<dependency>
    <groupId>jdom</groupId>
    <artifactId>jdom</artifactId>
    <version>1.0</version>
</dependency>
</dependencies>
</project>

的web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
     version="2.4">

<display-name>Archetype Created Web Application</display-name>

<servlet>
    <servlet-name>spring-ws</servlet-name>
    <servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
    <init-param>
      <param-name>transformWsdlLocations</param-name>
      <param-value>true</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>spring-ws</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

</web-app>

WEB-INF /弹簧-WS-servlet.xml中

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:context="http://www.springframework.org/schema/context"
xmlns:sws="http://www.springframework.org/schema/web-services" 
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.0.xsd">

<context:component-scan base-package="com.mycompany.hr.ws" />
<context:component-scan base-package="com.mycompany.hr.service" />

<sws:annotation-driven />

<sws:dynamic-wsdl id="holiday" 
    portTypeName="HumanResource"
    locationUri="/holidayService/" 
    targetNamespace="http://mycompany.com/hr/definitions">
    <sws:xsd location="/WEB-INF/hr.xsd" />
</sws:dynamic-wsdl>
</beans>

WEB-INF / hr.xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:hr="http://mycompany.com/hr/schemas" elementFormDefault="qualified"
targetNamespace="http://mycompany.com/hr/schemas">
<xs:element name="HolidayRequest">
    <xs:complexType>
        <xs:all>
            <xs:element name="Holiday" type="hr:HolidayType" />
            <xs:element name="Employee" type="hr:EmployeeType" />
        </xs:all>
    </xs:complexType>
</xs:element>
<xs:complexType name="HolidayType">
    <xs:sequence>
        <xs:element name="StartDate" type="xs:date" />
        <xs:element name="EndDate" type="xs:date" />
    </xs:sequence>
</xs:complexType>
<xs:complexType name="EmployeeType">
    <xs:sequence>
        <xs:element name="Number" type="xs:integer" />
        <xs:element name="FirstName" type="xs:string" />
        <xs:element name="LastName" type="xs:string" />
    </xs:sequence>
</xs:complexType>
</xs:schema>

HolidayEndpoint.java

package com.mycompany.hr.ws;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.Namespace;
import org.jdom.xpath.XPath;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ws.server.endpoint.annotation.Endpoint;
import org.springframework.ws.server.endpoint.annotation.PayloadRoot;
import org.springframework.ws.server.endpoint.annotation.RequestPayload;
import org.springframework.ws.server.endpoint.annotation.ResponsePayload;

import com.mycompany.hr.service.HumanResourceService;

@Endpoint
public class HolidayEndpoint {

    private static final String NAMESPACE_URI = "http://mycompany.com/hr/schemas";
    private XPath startDateExpression;
    private XPath endDateExpression;
    private XPath nameExpression;
    private HumanResourceService humanResourceService;

    @Autowired
    public HolidayEndpoint(HumanResourceService humanResourceService) throws JDOMException {
        this.humanResourceService = humanResourceService;

        Namespace namespace = Namespace.getNamespace("hr", NAMESPACE_URI);

        startDateExpression = XPath.newInstance("//hr:StartDate");
        startDateExpression.addNamespace(namespace);

        endDateExpression = XPath.newInstance("//hr:EndDate");
        endDateExpression.addNamespace(namespace);

        nameExpression = XPath.newInstance("concat(//hr:FirstName,' ',//hr:LastName)");
        nameExpression.addNamespace(namespace);
    }

    @PayloadRoot(namespace = NAMESPACE_URI, localPart = "HolidayRequest")
    @ResponsePayload
    public void handleHolidayRequest(@RequestPayload Element holidayRequest) throws Exception {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date startDate = dateFormat.parse(startDateExpression.valueOf(holidayRequest));
        Date endDate = dateFormat.parse(endDateExpression.valueOf(holidayRequest));
        String name = nameExpression.valueOf(holidayRequest);

        humanResourceService.bookHoliday(startDate, endDate, name);
    }

}

日志

2013-12-02 21:44:41 DEBUG WebServiceMessageReceiverHandlerAdapter:114 - Accepting incoming [org.springframework.ws.transport.http.HttpServletConnection@97263f] at [http://localhost:1111/holidayService/holidayService/]
2013-12-02 21:44:41 DEBUG received:171 - Received request [SaajSoapMessage {http://mycompany.com/hr/schemas}HolidayRequest]
2013-12-02 21:44:41 DEBUG PayloadRootAnnotationMethodEndpointMapping:65 - Looking up endpoint for [{http://mycompany.com/hr/schemas}HolidayRequest]
2013-12-02 21:44:41 DEBUG SoapMessageDispatcher:272 - Endpoint mapping [org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping@1a17727] maps request to endpoint [public void com.mycompany.hr.ws.HolidayEndpoint.handleHolidayRequest(org.jdom.Element) throws java.lang.Exception]
2013-12-02 21:44:41 DEBUG SoapMessageDispatcher:293 - Testing endpoint adapter [org.springframework.ws.server.endpoint.adapter.DefaultMethodEndpointAdapter@84fa6a]
2013-12-02 21:44:41 DEBUG DefaultListableBeanFactory:246 - Returning cached instance of singleton bean 'holidayEndpoint'
2013-12-02 21:44:41 DEBUG SoapFaultAnnotationExceptionResolver:103 - Resolving exception from endpoint [public void com.mycompany.hr.ws.HolidayEndpoint.handleHolidayRequest(org.jdom.Element) throws java.lang.Exception]: java.lang.IllegalStateException: No adapter for endpoint [public void com.mycompany.hr.ws.HolidayEndpoint.handleHolidayRequest(org.jdom.Element) throws java.lang.Exception]: Is your endpoint annotated with @Endpoint, or does it implement a supported interface like MessageHandler or PayloadEndpoint?
2013-12-02 21:44:41 DEBUG DefaultListableBeanFactory:246 - Returning cached instance of singleton bean 'holidayEndpoint'
2013-12-02 21:44:41 DEBUG SimpleSoapExceptionResolver:103 - Resolving exception from endpoint [public void com.mycompany.hr.ws.HolidayEndpoint.handleHolidayRequest(org.jdom.Element) throws java.lang.Exception]: java.lang.IllegalStateException: No adapter for endpoint [public void com.mycompany.hr.ws.HolidayEndpoint.handleHolidayRequest(org.jdom.Element) throws java.lang.Exception]: Is your endpoint annotated with @Endpoint, or does it implement a supported interface like MessageHandler or PayloadEndpoint?
2013-12-02 21:44:41 DEBUG SoapMessageDispatcher:333 - Endpoint invocation resulted in exception - responding with Fault
java.lang.IllegalStateException: No adapter for endpoint [public void com.mycompany.hr.ws.HolidayEndpoint.handleHolidayRequest(org.jdom.Element) throws java.lang.Exception]: 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:299)
    at org.springframework.ws.server.MessageDispatcher.dispatch(MessageDispatcher.java:232)
    at org.springframework.ws.server.MessageDispatcher.receive(MessageDispatcher.java:173)
    at org.springframework.ws.transport.support.WebServiceMessageReceiverObjectSupport.handleConnection(WebServiceMessageReceiverObjectSupport.java:88)
    at org.springframework.ws.transport.http.WebServiceMessageReceiverHandlerAdapter.handle(WebServiceMessageReceiverHandlerAdapter.java:59)
    at org.springframework.ws.transport.http.MessageDispatcherServlet.doService(MessageDispatcherServlet.java:292)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Thread.java:662)
2013-12-02 21:44:41 DEBUG sent:182 - Sent response [SaajSoapMessage {http://schemas.xmlsoap.org/soap/envelope/}Fault] for request [SaajSoapMessage {http://mycompany.com/hr/schemas}HolidayRequest]
2013-12-02 21:44:41 DEBUG MessageDispatcherServlet:966 - Successfully completed request

3 个答案:

答案 0 :(得分:23)

tutorial暂时没有更新。本教程仍引用JDOM1,而较新版本的Spring Web Services仅支持JDOM2。

<dependency>
    <groupId>jdom</groupId>
    <artifactId>jdom</artifactId>
    <version>1.0</version>
</dependency>

更改为

<dependency>
    <groupId>org.jdom</groupId>
    <artifactId>jdom</artifactId>
    <version>2.0.2</version>
</dependency>

并将org.jdom导入更改为org.jdom2

答案 1 :(得分:0)

最新的spring-ws(目前为2.1.4)使用DomPayloadMethodProcessor对Element参数进行支持检查。 在假日示例中,您必须将org.jdom.Element更改为org.w3c.dom.Element

答案 2 :(得分:0)

同样发生在我身上,但在这种情况下是因为注释@ResponsePayload@RequestPayload不存在。可能不是那么奇怪的错误。