2014-07-07 64 views
0

我是Spring集成中的新成員,並且在解組SOAP時遇到問題。我有以下示例XSD:spring集成:SpelEvaluationException:EL1004E :(方法8):方法調用:方法getResponseForSample(javax.xml.bind.JAXBElement)

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema targetNamespace="http://tempuri.org/" xmlns:tns="http://tempuri.org/" 
    version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:element name="FFSampleRequest"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="Timestamp" type="xs:string" minOccurs="1" 
        form="qualified" /> 
       <xs:element name="SampleType" type="xs:int" form="qualified" /> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="FFSampleResponse"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="Timestamp" type="xs:string" minOccurs="1" /> 
       <xs:element name="SampleType" type="xs:int" /> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="getResponseForSample" type="tns:getResponseForSample" /> 
    <xs:element name="getResponseForSampleResponse" type="tns:getResponseForSampleResponse" /> 
    <xs:complexType name="getResponseForSample"> 
     <xs:sequence> 
      <xs:element name="arg0" minOccurs="1"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element name="Timestamp" type="xs:string" 
          minOccurs="1" form="qualified" /> 
         <xs:element name="SampleType" type="xs:int" form="qualified" /> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="getResponseForSampleResponse"> 
     <xs:sequence> 
      <xs:element name="return" minOccurs="1"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element name="Timestamp" type="xs:string" 
          minOccurs="1" /> 
         <xs:element name="SampleType" type="xs:int" /> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

現在我已經創建使用jaxbmarshaller XJC編譯java文件,生成以下是objectFactory對象file.other文件FFSampleRequest,FFSampleResponse,GetResponseForSample,GetResponseForSampleResponse,包信息。把所有這些文件在

// 
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.4-2 
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
// Any modifications to this file will be lost upon recompilation of the source schema. 
// Generated on: 2014.07.07 at 06:00:25 PM GST 
// 




import javax.xml.bind.JAXBElement; 
import javax.xml.bind.annotation.XmlElementDecl; 
import javax.xml.bind.annotation.XmlRegistry; 
import javax.xml.namespace.QName; 


    @XmlRegistry 
public class ObjectFactory { 

    private final static QName _GetResponseForSample_QNAME = new QName("http://tempuri.org/", "getResponseForSample"); 
    private final static QName _GetResponseForSampleResponse_QNAME = new QName("http://tempuri.org/", "getResponseForSampleResponse"); 
     public ObjectFactory() { 
    } 

    /** 
    * Create an instance of {@link GetResponseForSample } 
    * 
    */ 
    public GetResponseForSample createGetResponseForSample() { 
     return new GetResponseForSample(); 
    } 

    /** 
    * Create an instance of {@link GetResponseForSampleResponse } 
    * 
    */ 
    public GetResponseForSampleResponse createGetResponseForSampleResponse() { 
     return new GetResponseForSampleResponse(); 
    } 

    /** 
    * Create an instance of {@link FFSampleRequest } 
    * 
    */ 
    public FFSampleRequest createFFSampleRequest() { 
     return new FFSampleRequest(); 
    } 

    /** 
    * Create an instance of {@link FFSampleResponse } 
    * 
    */ 
    public FFSampleResponse createFFSampleResponse() { 
     return new FFSampleResponse(); 
    } 

    /** 
    * Create an instance of {@link GetResponseForSample.Arg0 } 
    * 
    */ 
    public GetResponseForSample.Arg0 createGetResponseForSampleArg0() { 
     return new GetResponseForSample.Arg0(); 
    } 

    /** 
    * Create an instance of {@link GetResponseForSampleResponse.Return } 
    * 
    */ 
    public GetResponseForSampleResponse.Return createGetResponseForSampleResponseReturn() { 
     return new GetResponseForSampleResponse.Return(); 
    } 

    /** 
    * Create an instance of {@link JAXBElement }{@code <}{@link GetResponseForSample }{@code >}} 
    * 
    */ 
    @XmlElementDecl(namespace = "http://tempuri.org/", name = "getResponseForSample") 
    public JAXBElement<GetResponseForSample> createGetResponseForSample(GetResponseForSample value) { 
     return new JAXBElement<GetResponseForSample>(_GetResponseForSample_QNAME, GetResponseForSample.class, null, value); 
    } 

    /** 
    * Create an instance of {@link JAXBElement }{@code <}{@link GetResponseForSampleResponse }{@code >}} 
    * 
    */ 
    @XmlElementDecl(namespace = "http://tempuri.org/", name = "getResponseForSampleResponse") 
    public JAXBElement<GetResponseForSampleResponse> createGetResponseForSampleResponse(GetResponseForSampleResponse value) { 
     return new JAXBElement<GetResponseForSampleResponse>(_GetResponseForSampleResponse_QNAME, GetResponseForSampleResponse.class, null, value); 
    } 

} 

web.xml文件來處理SOAP請求:

<servlet> 
     <servlet-name>spring-ws</servlet-name> 
     <servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>WEB-INF/spring-ws-config.xml</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>spring-ws</servlet-name> 
     <url-pattern>/*</url-pattern> 
    </servlet-mapping> 

和使用的配置文件中的以下設置用於調用服務方法,這個請求:

<int:channel id="FFSampleRequestChannel"/> 

<int-ws:inbound-gateway id="ws-ffsample-gateway" request-channel="FFSampleRequestChannel" marshaller="marshaller" unmarshaller="marshaller"/> 

<bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
    <property name="contextPath" value="com.java.MyChannel.model" /> 
    </bean> 

<int:service-activator input-channel="FFSampleRequestChannel"> 
    <bean class="com.java.MyChannel.serviceImpl.FFSampleImpl"> 
    <constructor-arg ref = "ffSampleRequest"></constructor-arg> 

<bean id="ffSampleRequest" class="com.java.MyChannel.model.FFSampleRequest"></bean> 
    <bean id="ffSampleResponse" class="com.java.MyChannel.model.FFSampleResponse"></bean> 

我的soap請求成功地點擊了服務類,但是我收到異常。

/** 
    * @author Vinay Agrawal 
    */ 
    @XmlRegistry 
    public class FFSampleImpl implements FFSampleInterface 
    { 

     @Autowired 
     FFSampleRequest request; 
     @Autowired 
     FFSampleJdbc ffSampleJdbc; 
     public FFSampleImpl() { 
     } 

     public FFSampleImpl(FFSampleRequest request) { 
      super(); 
      this.request = request; 
     } 

     @Override 
     @PayloadRoot(localPart = "getResponseForSample" , namespace = "http://tempuri.org/") 
     @ResponsePayload 
     public FFSampleResponse getResponseForSample(@RequestPayload FFSampleRequest request){ 
      List<FFSampleResponse> ffSampleResponse = new ArrayList<FFSampleResponse>(); 

      return ffSampleResponse ; 

     } 
    } 

SOAP請求是如下:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://tempuri.org/"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <ser:getResponseForSample> 
     <!--Optional:--> 
     <arg0> 

      <ser:Timestamp>"100"</ser:Timestamp> 
      <ser:SampleType>15</ser:SampleType> 
     </arg0> 
     </ser:getResponseForSample> 
    </soapenv:Body> 
</soapenv:Envelope> 

我收到以下例外如下:

19:20:34.472 WARN [tomcat-http--15][org.springframework.integration.ws.MarshallingWebServiceInboundGateway] failure occurred in gateway sendAndReceive 
    org.springframework.messaging.MessageHandlingException: org.springframework.expression.spel.SpelEvaluationException: EL1004E:(pos 8): Method call: Method getResponseForSample(javax.xml.bind.JAXBElement) cannot be found on com.java.myChannel.serviceImpl.FFSampleImpl type 
     at org.springframework.integration.handler.MethodInvokingMessageProcessor.processMessage(MethodInvokingMessageProcessor.java:78) 
     at org.springframework.integration.handler.ServiceActivatingHandler.handleRequestMessage(ServiceActivatingHandler.java:71) 
     at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:170) 
     at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:78) 
     at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:116) 
     at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:101) 
     at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:97) 
     at org.springframework.integration.channel.AbstractSubscribablmyChannel.doSend(AbstractSubscribablmyChannel.java:77) 
     at org.springframework.integration.channel.AbstractMessagmyChannel.send(AbstractMessagmyChannel.java:255) 
     at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:114) 
     at org.springframework.messaging.core.GenericMessagingTemplate.doSendAndReceive(GenericMessagingTemplate.java:154) 
     at org.springframework.messaging.core.GenericMessagingTemplate.doSendAndReceive(GenericMessagingTemplate.java:44) 
     at org.springframework.messaging.core.AbstractMessagingTemplate.sendAndReceive(AbstractMessagingTemplate.java:75) 
     at org.springframework.integration.gateway.MessagingGatewaySupport.doSendAndReceive(MessagingGatewaySupport.java:250) 
     at org.springframework.integration.gateway.MessagingGatewaySupport.sendAndReceiveMessage(MessagingGatewaySupport.java:224) 
     at org.springframework.integration.ws.MarshallingWebServiceInboundGateway.doInvoke(MarshallingWebServiceInboundGateway.java:105) 
     at org.springframework.integration.ws.AbstractWebServiceInboundGateway.invoke(AbstractWebServiceInboundGateway.java:54) 
     at org.springframework.ws.server.endpoint.adapter.MessageEndpointAdapter.invoke(MessageEndpointAdapter.java:41) 
     at org.springframework.ws.server.MessageDispatcher.dispatch(MessageDispatcher.java:233) 
     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:961) 
     at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:647) 
     at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
     at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
     at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:409) 
     at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1044) 
     at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607) 
     at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
     at java.lang.Thread.run(Thread.java:745) 

我改變下面的服務方法的參數,但是當我嘗試接收的值在SOAP消息中給出的不是綁定,而是爲「SampleType」和「Timestamp」獲取空值。

public class FFSampleImpl implements FFSampleInterface 
    { 

     @Autowired 
     FFSampleRequest request; 
     public FFSampleImpl() { 
     } 

     public FFSampleImpl(FFSampleRequest request) { 
      super(); 
      this.request = request; 
     } 

     @Override 
     @PayloadRoot(localPart = "getResponseForSample" , namespace = "http://tempuri.org/") 
     @ResponsePayload 
     public FFSampleResponse getResponseForSample(@RequestPayload JAXBElement<FFSampleRequest> ffreq){ 
      FFSampleResponse ffSampleResponse2 = new FFSampleResponse(); 
      return ffSampleResponse2; 

     /* return FFSampleResponse;*/ 
     } 

我懷疑的是,在對象工廠創建的條目是不正確的,因爲覺得我面對的挑戰,因爲這些條目只(下面的條目)。請讓我知道,如果我們有任何限制使用jAXBMARSHALLER和xjc編譯器與Spring集成進行編組/解組的目的,因爲我面臨着許多來自xjc生成的java對象的soap映射的挑戰。請提供您的inpur並讓我知道我缺少綁定我的soap參數的地方。

/** 
    * Create an instance of {@link JAXBElement }{@code <}{@link GetResponseForSample }{@code >}} 
    * 
    */ 
    @XmlElementDecl(namespace = "http://tempuri.org/", name = "getResponseForSample") 
    public JAXBElement<FFSampleRequest> createGetResponseForSample(FFSampleRequest value) { 
     return new JAXBElement<FFSampleRequest>(_GetResponseForSample_QNAME, FFSampleRequest.class, null, value); 
    } 

    /** 
    * Create an instance of {@link JAXBElement }{@code <}{@link GetResponseForSampleResponse }{@code >}} 
    * 
    */ 
    @XmlElementDecl(namespace = "http://tempuri.org/", name = "getResponseForSampleResponse") 
    public JAXBElement<GetResponseForSampleResponse> createGetResponseForSampleResponse(GetResponseForSampleResponse value) { 
     return new JAXBElement<GetResponseForSampleResponse>(_GetResponseForSampleResponse_QNAME, GetResponseForSampleResponse.class, null, value); 
    } 

回答

0

我從來沒有使用JAXBElement,但它可能是有用的。 我生成XSD類和它們標記爲JAXB元素,例如:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "feeRequest", propOrder = { 
     "billerId", 
     "amount" 
}) 
@XmlRootElement(name = "feeRequest") 
public class FeeReqData { 

    @XmlElement(required = true) 
    protected Long billerId; 

    @XmlElement(required = true) 
    protected Double amount; 
} 

而且只有手動使用ObjectFactory,不依賴於JAXB魔法。

這足以讓我根據入站XML獲取正確的模型對象。

從另一方面來說,如果您使用FFSampleImpl作爲Spring集成<service-activator>,那麼沒有理由用Spring-WS註釋標記它的方法。

+0

非常感謝Artem。實際上,jaxbmarshaller xjc創建的文件並不總是正確的,但卻是真實的。我在Pojo文件和對象工廠手動更正了條目,現在這工作正常。 – user3777801

+0

很高興聽到! :-) –