0
我的應用程序既是SOAP服務器又是客戶端,我就像客戶端和Web服務提供者之間的代理服務器一樣。所以我得到不同的客戶端請求,我會做驗證並通過設置適當的SSL/TS配置將它們路由到目標SOAP服務。我正在使用Spring WS進行SOAP Web服務調用。下面的代碼工作正常:Spring WS/boot:如何在客戶端攔截器中設置WebServiceTemplate屬性?
try {
webServiceTemplate.setMessageSender(certManager.setKeystores());
// perform the transaction
SOAPResponse = (JAXBElement<Response>) webServiceTemplate
.marshalSendAndReceive(SoapRequest);
} catch(Exception e) {
// catching a broad exception here because many things can go wrong,
//but any exception means total failure
throw new ServiceException(e);
}
但我嘗試一種不同的方法時,我真想在客戶端攔截SSL配置:
public class AppClientInterceptor implements ClientInterceptor{
private static final Logger LOGGER = LoggerFactory
.getLogger(AppClientInterceptor.class);
@Autowired
WebServiceTemplate webServiceTemplate;
@Autowired
CertManager certManager;
@Override
public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException {
// pull out the request from the current thread
try {
LOGGER.info("before setting message sender");
if(webServiceTemplate!=null)
webServiceTemplate.setMessageSender(certManager.setKeystores());
else
System.out.println("web service tempate is null");
return false;
} catch (GeneralSecurityException | IOException e) {
// TODO Auto-generated catch block
LOGGER.info("In catch block unable to set keystores");
e.printStackTrace();
}
return false;
}
當我使Web服務調用客戶端攔截器得到調用,但由於webservicetemplate爲空而失敗。我連線了Web服務模板,但無法理解爲什麼它爲null。我使用的web服務模板如下:
@Bean
public WebServiceTemplate webServiceTemplate() {
WebServiceTemplate webServiceTemplate = new WebServiceTemplate();
webServiceTemplate.setMarshaller(jaxb2Marshaller());
webServiceTemplate.setUnmarshaller(jaxb2Marshaller());
ClientInterceptor[] interceptors = {new AppClientInterceptor()};
webServiceTemplate.setInterceptors(interceptors);
webServiceTemplate.setDefaultUri(
"https://destinationserver.com:10072");
return webServiceTemplate;
}
我可以在我的攔截器中以上述方式設置SSL配置嗎?這是一個正確的方法嗎?
在此先感謝