我有一个看起来或多或少像这样的Metro jax-ws网络服务:
@WebService
@Transactional
public class UserManagementServiceImpl {
@Resource
private WebServiceContext context;
...
}
WebServiceContext
总是空的。但是,如果我删除@Transactional
,则会注入WebServiceContext。
有人知道解决方法吗?
感谢。
答案 0 :(得分:4)
我找到了解决方法。使用setter注入而不是现场注入:
@WebService
@Transactional
public class UserManagementServiceImpl {
private WebServiceContext context;
@Resource
public void setContext(WebServiceContext context) {
this.context = context;
}
...
}
答案 1 :(得分:2)
webservices和事务管理的问题在于每个都创建了一个类的代理,第二个创建代理并没有得到真正的实现,而是代理(事情向南)。
避免这种情况的方法是将所有来自Web服务端点实现的调用委托给服务。所以你需要两个具体的类:S。
我不知道这是否是最佳方式,但这是我发现的最佳方式。
和它可能会稍微清理代码,因为它看起来像用户管理器关心webservices,这看起来不正确。
答案 2 :(得分:1)
我怀疑在处理对Web服务的同时调用时可能会出现问题,因为Servlet是一个单例,所有实例数据都是"共享"通过所有线程 - 所以你的"私人环境"即使您仍然忙于之前的通话,下一次通话也会被覆盖。也许像是
ThreadLocal<WebServiceContext> WSS = new ThreadLocal<WebServiceContext>();
@Resource
public void setContext(WebServiceContext context) {
WSS.set(context);
}
// then where you need the context use WSS.get();