Spring WS/boot:如何在客户端拦截器中设置WebServiceTemplate属性?

问题描述:

我的应用程序既是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配置吗?这是一个正确的方法吗?

在此先感谢

您是否在类定义之前尝试过@Configurable注释?

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