У меня есть весенний веб-сервис, например,
@Endpoint
public class ServiceEndpoint {
private final RequestProcessingService requestProcessingService;
private final String NAMESPACE = "http://example.com/schemas";
@Autowired
public ServiceEndpoint(RequestProcessingService requestProcessingService) {
this.requestProcessingService = requestProcessingService;
}
@ResponsePayload
@PayloadRoot(namespace = NAMESPACE, localPart = "ServiceInfoRequest")
public ServiceInfoResponse handleService(@RequestPayload String serviceInfoRequest) {
//Business Logic here
}
}
Полезная нагрузка запроса выглядит следующим образом:
@XmlRootElement(name = "ServiceInfoRequest", namespace = NAMESPACE)
@XmlAccessorType(XmlAccessType.FIELD)
public class ServiceInfoRequestBase implements Serializable {
private static final long serialVersionUID = 1L;
private String amount;
private String username;
private String serviceCode;
}
Я получаю запрос от клиента в зашифрованном виде (данные) и вместе с этим я получаю подпись и секретный ключ. Мне нужно расшифровать данные в вышеупомянутом DTO, прежде чем он достигнет конечной точки. Я сделал следующее:
@Override
public boolean handleRequest(MessageContext messageContext, Object endpoint) throws Exception {
LOG.info("Endpoint Request Handling");
SaajSoapMessage saajSoapMessage = (SaajSoapMessage) messageContext
.getRequest();
SOAPMessage soapMessage = saajSoapMessage.getSaajMessage();
SOAPBody soapBody = soapMessage.getSOAPBody();
DOMSource source = new DOMSource(soapBody);
StringWriter stringResult = new StringWriter();
TransformerFactory.newInstance().newTransformer().transform(source, new StreamResult(stringResult));
String message = stringResult.toString();
//TODO: decrypt and change soap request
return true;
}
Но я не совсем понимаю, как изменить запрос soap, чтобы изменить его на ServiceInfoRequest для конечной точки. Клиент будет отправлять запрос как
<xml>
<data>enc data</data>
<signature> sign </data>
<secret_key> key </secret_key>
</xml>