2011-12-15 7 views
5

Sto lavorando ai servizi Web di primavera. Ho bisogno di aggiungere alcuni elementi personalizzati nella richiesta e la risposta message.which dovrebbe assomigliare a questo:Come leggere le informazioni dell'intestazione SOAP dalla richiesta e aggiungerlo alla risposta nei servizi Web di primavera

<soapenv:Envelope> 
    <soapenv:Header> 
     <tid:SplsTID> 
     <tid:Trantype>123</tid:Trantype> 
     <tid:Tranver>234</tid:Tranver> 
     </tid:SplsTID> 
    </soapenv:Header> 
    <soapenv:Body> 
     <get:GetOrderNumberRequest LoggingLevel="REGULAR" MonitorFlag="Y"> 
     <get:Header> 
      <get:TransactionId>111</get:TransactionId> 
      <get:SourceSystemId>SOMS</get:SourceSystemId> 
      <get:DateTime>2011-11-11T11:11:11</get:DateTime> 
     </get:Header> 
     <get:Body> 
      <get:StaplesOrderNumber RangeFlag="N" ReleaseFlag="N"> 
       <get:OrderNumber Count="1" End="11" Start="9"/> 
      </get:StaplesOrderNumber> 
     </get:Body> 
     </get:GetOrderNumberRequest> 
    </soapenv:Body> 
</soapenv:Envelope> 

io sono in grado di aggiungere <tid:SplsTID> sotto <soapenv:Header> a richiesta modificando il file WSDL. che assomiglia a questo:

<wsdl:message name="GetOrderNumberRequest"> 
     <wsdl:part element="tns:GetOrderNumberRequest" name="GetOrderNumberRequest"> 
     </wsdl:part> 
     <wsdl:part element="sch1:SplsTID" name="SplsTID"> 
     </wsdl:part> 
    </wsdl:message> 
    <wsdl:message name="GetOrderNumberResponse"> 
     <wsdl:part element="tns:GetOrderNumberResponse" name="GetOrderNumberResponse"> 
     </wsdl:part> 
     <wsdl:part element="sch1:SplsTID" name="SplsTID"> 
     </wsdl:part> 
    </wsdl:message> 
    <wsdl:portType name="ONAS"> 
     <wsdl:operation name="GetOrderNumber"> 
      <wsdl:input message="tns:GetOrderNumberRequest" name="GetOrderNumberRequest"> 
      </wsdl:input> 
      <wsdl:output message="tns:GetOrderNumberResponse" name="GetOrderNumberResponse"> 
      </wsdl:output> 
     </wsdl:operation> 
    </wsdl:portType> 

Il problema è che io voglio leggere <tid:SplsTID> parte dalla richiesta e volevo aggiungere sotto parte di intestazione del sapone della risposta, che non sta accadendo. sto usando l'endpoint basato sull'annotazione. qual è il codice che leggerà l'intestazione del sapone e aggiungerà lo stesso nella risposta.

Attualmente il mio classe punto finale è:

@Endpoint 
public class OrderNumberServiceEndPoint { 
    public static final String NAMESPACE_URI = "http://schemas.staples.com/onas/getOrderNumber"; 

    /** 
    * The local name of the expected request. 
    */ 
    public static final String REQUEST_LOCAL_NAME = "GetOrderNumberRequest"; 

    /** 
    * The local name of the created response. 
    */ 
    public static final String RESPONSE_LOCAL_NAME = "GetOrderNumberResponse"; 

    private GetOrderNumberService getOrderNumberService; 

    public void setGetOrderNumberService(
      GetOrderNumberService getOrderNumberService) { 
     this.getOrderNumberService = getOrderNumberService; 
    } 

    @PayloadRoot(localPart = REQUEST_LOCAL_NAME, namespace = NAMESPACE_URI) 
    public GetOrderNumberResponse processOrderNumberRequest(
      GetOrderNumberRequest request) throws Exception { 
     GetOrderNumberResponse response = null; 
     try{ 
     response = getOrderNumberService.executeRequest(request); 
     }catch(CannotCreateTransactionException e){ 
      logger.error(ErrorConstants.ERROR_E17); 
      throw new ServiceException(ErrorConstants.ERROR_E17); 
     } 
     return response; 
    } 

} 

fatemi sapere se sono necessari ulteriori dettagli. Qualsiasi aiuto sarebbe apprezzato.

risposta

3

Questo è probabilmente solo la metà la risposta che cercavi, ma penso che si può leggere i soapheaders ottenendo il (Saaj) SOAPMessage dal MessageContext, in questo modo:

@PayloadRoot(
    localPart = "GetHiredCandidatesRequest", 
    namespace = DEFAULT_NAMESPACE 
) 
@ResponsePayload 
public GetHiredCandidatesResponse getKandidaat (
    @RequestPayload GetHiredCandidatesRequest getCandidate, 
    MessageContext messageContext) { 

    SaajSoapMessage request = (SaajSoapMessage) messageContext.getRequest(); 
    SoapHeader header = request.getSoapHeader(); 

    GetHiredCandidatesResponse response = objectFactory.createGetHiredCandidatesResponse(); 
    response.getCandidate().addAll(
     candidateService.getHiredCandidates(
      getCandidate.getFrom(), 
      getCandidate.getTo() 
     ) 
    ); 

    return response; 
} 

Dalla versione 2 è possibile automaticamente 'aggiungi 'alcuni oggetti alla firma del tuo metodo, come aggiungo lo MessageContext qui. Ho usato questo per ottenere gli allegati da un messaggio di sapone, per esempio. Probabilmente è possibile utilizzare anche altre sottoclassi di AbstractSoapMessage poiché il metodo getSoapHeder è in quella classe.

[modifica] BTW: Forse è possibile utilizzare anche Interceptors poiché la richiesta/risposta viene fornita lì. Dai un'occhiata al pacchetto org.springframework.ws.soap.server.endpoint.interceptor per alcuni esempi predefiniti. [/ edit]

+0

ho fatto riferimento la documentazione di primavera [link] (http://static.springsource.org/spring-ws/site/reference/html/server.html Ho avuto successo nella lettura dell'intestazione SOAP all'interno del mio metodo. Ho modificato il mio metodo di classe dell'endpoint in questo modo: '@PayloadRoot (localPart = REQUEST_LOCAL_NAME, namespace = NAMESPACE_URI) @ResponsePayload public SaajSoapMessage processOrderNumberRequest (@RequestPayload GetOrderNumberRequest request, SoapHeader header) '.ora genera errore' java.lang.IllegalStateException: nessun adattatore per endpoint' perché ho cambiato il metodo return type in 'SaajSoapMessage' da' GetOrderNumberResponse'. non ha funzionato –

+0

Penso che non si possa usare 'SaajSoapMessage' come tipo di ritorno. Probabilmente hai bisogno di usare 'GetOrderNumberResponse' per abbinare il tuo WSDL. Nel mio esempio ottengo la richiesta dal 'MessageContext', ma è possibile ottenere anche l'oggetto risposta e probabilmente impostare alcune intestazioni di sapone lì. – evandongen

+0

Nell'esempio, il tipo restituito dal metodo è 'Response'. È la parte PayLoad del messaggio di risposta? Mi chiedo se restituiremo la parte Payload della risposta che viene effettivamente inclusa nella porzione Soap Body, quindi come verrà aggiunta la parte dell'intestazione nella risposta? Inoltre non ottiene alcun codice funzionante che risolva questo requisito. Non voglio fare nulla con la parte di intestazione, qualunque cosa entri nella richiesta basta inviare come è nella risposta. la logica è solo per il calcolo della parte di carico del corpo. Sembra un requisito molto generale per i servizi Web, ma molto scarsamente documentato per springWS. –

11

Finalmente sono riuscito a leggere l'intestazione del sapone dalla richiesta e aggiungere in risposta. Ecco come il mio metodo di punto finale si presenta come la società:

@PayloadRoot(localPart = REQUEST_LOCAL_NAME, namespace = NAMESPACE_URI) 
    @ResponsePayload 
    public GetOrderNumberResponse processOrderNumberRequest(
      @RequestPayload GetOrderNumberRequest request, 
      MessageContext messageContext) throws Exception { 
     logger.info("Request Received"); 
     // read SOAP Header from request and append in response 
     SaajSoapMessage soapRequest = (SaajSoapMessage) messageContext 
       .getRequest(); 
     SoapHeader reqheader = soapRequest.getSoapHeader(); 
     SaajSoapMessage soapResponse = (SaajSoapMessage) messageContext 
       .getResponse(); 
     SoapHeader respheader = soapResponse.getSoapHeader(); 
     TransformerFactory transformerFactory = TransformerFactory 
       .newInstance(); 
     Transformer transformer = transformerFactory.newTransformer(); 
     Iterator<SoapHeaderElement> itr = reqheader.examineAllHeaderElements(); 
     while (itr.hasNext()) { 
      SoapHeaderElement ele = itr.next(); 
      transformer.transform(ele.getSource(), respheader.getResult()); 
     } 
     // process the request PayLoad 
     GetOrderNumberResponse response = null; 
     try { 
      response = getOrderNumberService.executeRequest(request); 
     } catch (CannotCreateTransactionException e) { 
      logger.error(ErrorConstants.ERROR_E17); 
      throw new ServiceException(ErrorConstants.ERROR_E17); 
     } 
     logger.info("Response Sent"); 
     return response; 
    } 
+0

Sono contento che tu abbia capito in base a ciò che ho pubblicato. Sono d'accordo con te è difficile capire tutto (proprio come quando si usano gli allegati SOAP per esempio). – evandongen

+0

Non sta utilizzando gli allegati SOAP? – ziggy

+0

Sto affrontando lo stesso problema, quindi sono molto contento di vedere la tua soluzione, ci proverò domani. Grazie. – anhtuangv

Problemi correlati