【发布时间】:2016-08-04 12:48:46
【问题描述】:
我有一个带有 Spring 容器的 Jax-Ws Metro 项目。我无法在 SoapHandler 中自动装配字段。我尝试了互联网资源中的所有内容,但没有成功。该字段始终为空。字段名称为“paymentPortalService”。
我的处理程序类:
public class CustomSoapHeaderHandler extends SpringBeanAutowiringSupport implements SOAPHandler<SOAPMessageContext> {
private static final Logger log = Logger.getLogger(CustomSoapHeaderHandler.class);
@Autowire
private PaymentPortalService paymentPortalService;
}
我有一个调用远程服务的代理服务。在远程服务调用方法中将此处理程序添加到处理程序链:
@Service
public class CustomServiceProxy {
private final Logger log = Logger.getLogger(CustomServiceProxy.class);
private RemoteServicePort pspPort;
public CustomServiceProxy() {
try {
pspPort = new RemoteService_Service(new URL("https://x?wsdl")).getRemoteServicePort();
Binding binding = ((BindingProvider) pspPort).getBinding();
List<Handler> handlers = binding.getHandlerChain();
handlers.add(new CustomSoapHeaderHandler());
binding.setHandlerChain(handlers);
}
}
我尝试将@Autowire 更改为@Resource 和互联网上的其他一些解决方案,但没有成功。我正在使用没有 EE 容器的 Apache Tomcat 8。
提前致谢!
【问题讨论】:
-
为什么不应该是
null。您正在自己创建CustomSoapHeaderHandler的实例。它不受任何类型的容器管理,无论是球衣还是 Spring。所以不会注入任何东西。我建议您阅读球衣文档而不是黑客攻击,该文档非常清楚地解释了如何使用 Spring 设置球衣。 -
感谢您的回复!是的,我知道这是一个愚蠢的错误,我将其更改为: Autowired private CustomSoapHeaderHandler customSoapHeaderHandler;但它仍然不起作用。处理程序对象为空。我还在 CustomSoapHeaderHandler 类中添加了 Component 注释。
-
如前所述阅读the documentation 而不是尝试错误的事情。接下来你的
SoapHandler需要是@Component,我假设你已经设置了组件扫描。 (请删除扩展SpringBeanAutowiringSupport,因为这不会增加任何内容。 -
这不是泽西岛,而是地铁项目。您能否提供一份文档,显示 Jax-Ws(Metro)中带有 Spring DI 的客户端处理程序?组件扫描适用于同一包中的其他类。
-
您只是在使用 Jax-WS 构建一个客户端来调用我假设的 Web 服务?剩下的就是春天了?如果是这样,那么不要在 java 中手动配置,而是使用
JaxWsPortProxyFactoryBean进行配置。但是,您的主要问题只是您的处理程序不是 Spring 托管的 bean,只需使其成为一个。
标签: java spring web-services jax-ws spring-ioc