1

私はJava6とspring-wsを使用して、BusquedaRequest Jaxbオブジェクトの形式で2つのパラメーターを受け取り、同じオブジェクトを返す非常に単純なWebサービスを作成しています。

オブジェクトはxjcコンパイラで作成されており、マシャラーとしてJaxb2Marshallerを使用し、着信xmlに変換して送信するためにGenericMarshallingMethodEndpointAdapterを使用しています。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コンパイラを使用してオブジェクトをコンパイルすることを提案するこの質問への応答を見てきました。また、アダプタがspring-ws-servlet.xmlで定義されていないという提案もありましたが、これも私が行いました。以下に定義されているspring-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> 

誰かが私がすでに実装した提案を拡張する考えを持っていますか?

4

2 に答える 2

4

同じ問題に直面したとき、EndPoint 実装のメソッドのパラメーターに@RequestPayloadおよび@ResponsePayloadアノテーションを追加すると問題が解決することがわかりました。

于 2012-06-04T03:44:14.880 に答える
2

@whatsthebeef 話題から外れているか、遅いかもしれませんが、問題がどこにあるのか、私の観点から見たマーシャラーの使用方法は悪臭を放っています。

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

2 つ目は、スプリング コンテキストがマーシャラーについてどのように認識すべきかということです。適切なマーシャラーを使用していません。

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

それが、現在の spring-ws パッケージで行った方法です。ところで、スタック トレースは、問題が *EndpointAdapter にあることを示しています。それがあなたを助けたかどうか私に知らせてください。

于 2011-07-12T07:51:59.873 に答える