【问题标题】:Spring WS/boot: How to set WebServiceTemplate property in client interceptor?Spring WS/boot:如何在客户端拦截器中设置 WebServiceTemplate 属性?
【发布时间】:2017-03-18 00:53:54
【问题描述】:

我的应用程序既是 SOAP 服务器又是客户端,即它在客户端和 Web 服务提供商之间充当代理服务器。所以我收到不同的客户端请求,我将通过设置适当的 SSL/TS 配置进行验证并将它们路由到目标soap服务。我正在使用 Spring WS 进行 SOAP Web 服务调用。下面的代码工作正常:

     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 服务模板,但无法理解为什么它为空。我使用的网络服务模板如下:

@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 配置吗?这是一个正确的方法吗?

提前致谢

【问题讨论】:

标签: java spring soap spring-boot spring-ws


【解决方案1】:

你在类定义之前尝试过@Configurable注解吗?

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

【讨论】:

猜你喜欢
  • 2019-07-02
  • 2020-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-09
  • 1970-01-01
相关资源
最近更新 更多