2010-12-22 4 views
1

Java 6와 spring-ws를 사용하여 BusquedaRequest Jaxb 객체의 형태로 2 개의 매개 변수를받는 매우 간단한 웹 서비스를 만들고 동일한 객체를 리턴한다.annotated endpoints를 사용할 때 spring이 어댑터를 찾지 못한다.

개체가 xjc 컴파일러로 만들어졌으며 Jashb2Marshaller를 mashaller로 사용하고 GenericMarshallingMethodEndpointAdapter를 사용하여 들어오는 xml 및 out으로 변환합니다. AbstractMarshallingPayloadEndpoint 클래스를 확장 할 때이 작업을 수행했지만 Endpoint 및 Payload 주석을 사용하도록 전환하면 항상 실패합니다.

웹 서비스가 정상적으로 시작되지만 클라이언트와 충돌 할 때이 예외가 발생합니다.

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 파일은 아래의 정의 : 나는 다음과 같이 BusqeudaRequest 객체가 생성 된 XSD를

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

} 

: 다음과 같이

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

클래스 엔드 포인트가

 <?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'를 반환 하시겠습니까? –

+0

Funnily 나는 그것을 사용하고 있었고 예외의 첫 번째 줄만 들여 쓰면서 xmls 4 칸으로 전체를 목록 화하는 것처럼 보였다. 그러나 나는이 행동을 복제 할 수 없으므로 내 일의 일부라고 생각합니다. 사과를 드리기 위해이 사실을 깨닫 자마자 편집을 시도했지만 먼저 거기에갔습니다. 고치기 – zode64

+0

@ org.life.java 고쳐 주셔서 감사합니다. 단순화 방법 이었기 때문에 원래 하나의 jaxb 객체 만 사용하고있었습니다. 원래는 여러 개를 사용하고있었습니다. 나는 그것이 물건을 조금 혼란스럽게 할지도 모른다라고 인정한다. – zode64

답변

2

@whatsthebeef 어쩌면 문제가있는 곳에서 볼 수 있습니다. 내 관점에서 마샬 러를 사용하는 방식이 악취 일 수 있습니다.

왜 classToBeBound를 사용합니까? 당신이 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> 

2 가지가 패키지에 '단지'를 가리켜 야 사용하는 경우 , 방법 마샬에 대해 알고 문맥을 봄해야합니까? 나는 적절한 마샬 러를 사용하는 것을 그리워합니다.

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

나는 현재 스프링 - ws 패키지로 그랬다. stacktrace는 문제가 * EndpointAdapter와 있음을 알려줍니다. 도움이되었는지 알려주세요. 동일한 문제에 직면했을 때

+0

이 질문에 감사드립니다. 감사합니다! http://stackoverflow.com/questions/19032798/spring-ws-jibx-no-adapter-for-endpoint-error – Spring

4

, 난은 추가 을 @RequestPayload 및 문제를 해결할 엔드 구현에있어서의 파라미터 주석 @ResponsePayload하였습니다.

+0

또한 컨텍스트 파일에서 웹 서비스 주석을 활성화하는 것을 잊지 마십시오. –

관련 문제