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.
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 –
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
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. –