2010-12-22 36 views
1

我正在使用Java 6和spring-ws創建一個非常簡單的web服務,它以BusquedaRequest Jaxb對象的形式接收2個參數並返回相同的對象。spring使用帶註釋的端點時找不到適配器

該對象已使用xjc編譯器創建,我使用Jaxb2Marshaller作爲mashaller,GenericMarshallingMethodEndpointAdapter將其轉換爲傳入的xml並轉出。當擴展AbstractMarshallingPayloadEndpoint類時,我有這個工作,但當我切換到使用Endpoint和有效內容註釋時,它總是失敗。

Web服務啓動正常,但當用客戶端點擊它時,我收到此異常。

java.lang.IllegalStateException: No adapter for endpoint [public package.busqueda.ws.BusquedaRequest package.busqueda.ws.BusquedaEndpoint.getResultas(package.busqueda.ws.BusquedaRequest)]: Does your endpoint implement a supported interface like MessageHandler or PayloadEndpoint? 
at org.springframework.ws.server.MessageDispatcher.getEndpointAdapter(MessageDispatcher.java:286) 
at org.springframework.ws.server.MessageDispatcher.dispatch(MessageDispatcher.java:227) 
at org.springframework.ws.server.MessageDispatcher.receive(MessageDispatcher.java:170) 
at org.springframework.ws.transport.support.WebServiceMessageReceiverObjectSupport.handleConnection(WebServiceMessageReceiverObjectSupport.java:88) 
at org.springframework.ws.transport.http.WebServiceMessageReceiverHandlerAdapter.handle(WebServiceMessageReceiverHandlerAdapter.java:57) 
at org.springframework.ws.transport.http.MessageDispatcherServlet.doService(MessageDispatcherServlet.java:230) 
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) 
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
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:191) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
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:298) 
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852) 
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) 
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
at java.lang.Thread.run(Thread.java:662) 

我見過這個問題的答案,它表明使用我已經完成的xjc編譯器編譯對象。還有一些建議認爲Adapter沒有在spring-ws-servlet.xml中定義,我也這樣做過。看到彈簧WS-servlet.xml中定義如下:

<?xml version="1.0" encoding="UTF-8"?> 
    <beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> 

<bean id="busquedaEndpoint" class="package.BusquedaEndpoint" /> 

<bean class="org.springframework.ws.server.endpoint.adapter.GenericMarshallingMethodEndpointAdapter"> 
     <constructor-arg ref="marshaller"/> 
    </bean> 

    <bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
     <property name="classesToBeBound"> 
      <list> 
       <value>package.BusquedaRequest</value> 
      </list> 
     </property> 
    </bean> 

<bean id="busqueda" 
    class="org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition"> 
    <property name="schema" ref="schema" /> 
    <property name="portTypeName" value="Busqueda" /> 
    <property name="locationUri" value="/BusquedaService/" /> 
</bean> 

<bean id="schema" class="org.springframework.xml.xsd.SimpleXsdSchema"> 
    <property name="xsd" value="/WEB-INF/busqueda.xsd" /> 
</bean> 

<bean class="org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping"/> 
</beans> 

類端點如下:

package package.busqueda.ws; 

import org.springframework.ws.server.endpoint.annotation.Endpoint; 
import org.springframework.ws.server.endpoint.annotation.PayloadRoot; 

    @Endpoint 
public class BusquedaEndpoint { 

@PayloadRoot(localPart = "BusquedaRequest", namespace = "http://busqueda/schemas") 
public BusquedaRequest getResultas(BusquedaRequest aRequest) { 
    return aRequest; 
} 

} 

我產生的BusqeudaRequest目的是如下的xsd:

 <?xml version="1.0" encoding="UTF-8"?> 
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
elementFormDefault="qualified" 
attributeFormDefault="qualified" 
xmlns="http://busqueda/schemas" 
targetNamespace="http://busqueda/schemas"> 
<xs:element name="BusquedaRequest"> 
    <xs:complexType> 
    <xs:all> 
    <xs:element name="Consulta" type="xs:string" /> 
    <xs:element name="Permisos" type="xs:string" /> 
    </xs:all> 
    </xs:complexType> 
</xs:element> 
</xs:schema> 

任何人都有任何想法延伸我已經實施的建議?

+0

您確定要返回`BusquedaRequest`嗎? – 2010-12-22 18:08:37

+0

有趣的是,我使用它,並通過縮進例外的第一行和xmls 4空格,它似乎編纂了一大堆。然而,我無法複製這種行爲,所以我認爲這是我做的事情,爲此我表示歉意,儘快在我意識到這種情況時嘗試編輯,但您首先到達那裏。 Thankyou修復 – zode64 2010-12-22 18:08:50

+0

@ org.life.java,這是一種簡化的方式,所以我只使用一個jaxb對象,最初我使用了多個。我承認這可能會讓事情有點混亂。 – zode64 2010-12-22 18:09:52

回答

2

@whatsthebeef也許它是偏離主題,或者遲到,但是我看到問題出在哪裏, 從我的角度來看,使用Marshaller的方式很臭。

爲什麼使用classesToBeBound? 如果使用XJC & JAXB生成過程中,你真的應該「只是」指向該程序包即

<bean id="jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
    <property name="contextPaths"> 
     <list> 
      <value>my.package.where.the.jaxb-generated.stub-objects.reside</value> 
     </list> 
    </property> 
</bean> 

第二個問題是,應該如何Spring上下文知道你編組?我錯過使用適當的Marshaller。

<bean id="endpointAdapter" class="org.springframework.ws.server.endpoint.adapter.MarshallingMethodEndpointAdapter"> 
    <constructor-arg ref="jaxb2Marshaller"/> 
</bean> 

這就是我用當前的spring-ws包做的。 順便說一句stacktrace告訴你問題出在* EndpointAdapter上。 請讓我知道它是否幫助你。

4

當面臨同樣的問題,我發現,添加@RequestPayload@ResponsePayload註釋在端點實施將解決這一問題的方法的參數。

相關問題