2012-10-15 17 views
6

Attualmente sto implementando un servizio Web Spring utilizzando jaxb. Ma quando provo a consumare il servizio web creato si incontra un errore WebServiceTransportException: Not Found [404]. Ho provato a cercare in rete ma non sono riuscito a trovare una possibile causa principale. Di seguito ho mostrato i miei codici sorgente.WebServiceTransportException: Not Found [404]

applicazione context.xml

<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>com.ph.domain.EightBallRequest</value> 
      <value>com.ph.domain.EightBallResponse</value> 
     </list> 
    </property> 
</bean> 

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="prefix"> 
     <value>/jsp/</value> 
    </property> 
    <property name="suffix"> 
     <value>.jsp</value> 
    </property> 
</bean> 

<bean id="simpleUrlHandlerMapping" 
    class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" 
    lazy-init="true"> 
    <property name="mappings"> 
     <props> 
      <prop key="/test.asp">LandingController</prop> 
     </props> 
    </property> 
</bean>  

<bean name="LandingController" class="com.ph.controller.LandingController"> 
    <property name="stub" ref="eightBallClient"/> 
</bean> 

Client per webservice

public class EightBallClient extends WebServiceGatewaySupport { 

private Resource request; 

public void setRequest(Resource request) { 
    this.request = request; 
} 

public String AskQuestion(String question) throws IOException { 
    String responseString = null; 

    EightBallRequest request = new EightBallRequest(); 
    request.setQuestion(question); 

    EightBallResponse response = new EightBallResponse(); 

    response = (EightBallResponse) getWebServiceTemplate() 
      .marshalSendAndReceive(request); 
    responseString = response.getAnswer().toString(); 
    return responseString; 
} 
} 

definizione del mio servizio web

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

E sotto è la stack errori:

SEVERE: Servlet.service() for servlet dispatcher threw exception 
org.springframework.ws.client.WebServiceTransportException: Not Found [404] 
    at org.springframework.ws.client.core.WebServiceTemplate.handleError(WebServiceTemplate.java:626) 
    at org.springframework.ws.client.core.WebServiceTemplate.doSendAndReceive(WebServiceTemplate.java:550) 
    at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:501) 
    at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:350) 
    at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:344) 
    at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:336) 
+0

si prega di controllare la cartella lib hai incluso questo jar spring-oxm-1.5.6.jar? – Ami

+0

@ILLA - sì, la primavera-OXM-1.5.6.jar è comprendere come pure i campi vaso di seguito: \ n primavera-OXM-tigre primavera-ws primavera-ws-nucleo primavera-WS-core- tigre – plandi07

+0

@ILLA - conosci un sito che fornisce tutorial/implementazione completi dalla creazione di servizi Web di primavera con JAXB fino al consumo del servizio al cliente. Sono un po 'confuso su come il client consumerà il webservice di primavera ... Sono aggiornato sul progetto che ha bisogno di esporre il livello di servizio esistente dell'applicazione Spring Mvc in modo che altre applicazioni possano usarlo. qualche idea? Grazie in anticipo. – plandi07

risposta

0

Forse il vostro URI:

<bean name="webserviceTemplate" 
class="org.springframework.ws.client.core.WebServiceTemplate"> 
    <property name="defaultUri" value="http://localhost:8080/mywebservice" /> 

Controllare questo valore:

"http://mylocal:8080/mywebservice"

1

Qui è come ho risolto questo errore:

  1. Dichiarare un SoapActionCallback.
  2. Utilizzare questa richiamata nel marshalSendAndReceive() come segue.

    final EightBallResponse response = new EightBallResponse(); 
    final SoapActionCallback soapActionCallback = new SoapActionCallback("<the operation name as defined in the WSDL>"); 
    response = (EightBallResponse) getWebServiceTemplate() 
        .marshalSendAndReceive(request, soapActionCallback); 
    responseString = response.getAnswer().toString(); 
    
1

Nel mio caso, la soluzione è stata di prestare attenzione al caso in l'URI. Ho avuto tutto in minuscolo, ma il webservice si aspettava un nome di azione CamelCase.

Problemi correlati