2017-03-18 57 views
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配置嗎?這是一個正確的方法嗎?

在此先感謝

回答

0

您是否在類定義之前嘗試過@Configurable註釋?

@Configurable 
public class AppClientInterceptor implements ClientInterceptor{ 
    ... 
}