如何在Spring的@Transactional中使用@Resource WebServiceContext注入

时间:2011-04-28 15:19:48

标签: java spring jax-ws java-metro-framework

我有一个看起来或多或少像这样的Metro jax-ws网络服务:

@WebService
@Transactional
public class UserManagementServiceImpl {

    @Resource
    private WebServiceContext context;

    ...
}

WebServiceContext总是空的。但是,如果我删除@Transactional,则会注入WebServiceContext。

有人知道解决方法吗?

感谢。

3 个答案:

答案 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();