2013-03-06 46 views
1

我正在使用JBoss 7.1和Java 1.6。向JAX-WS注入Guice POJO

我想通过JAX-WS端点集成Guice服务。使用Gunnar.Morling描述的拦截器模式,我可以在使用无状态bean作为web服务时正确地实例化Guice模块。但是我不能用一个简单的POJO注释的web服务来做同样的事情。这有可能让任何人找到解决方法。以下是我迄今为止的工作总结。

@UsesGuice @Interceptor 
public class GuiceInterceptor { 

    @Inject 
    private GuiceInjectorHolderBean injectorHolder; 

    @AroundInvoke 
    public Object aroundAdvice(final InvocationContext ctx) throws Exception { 
    if (ctx.getTarget().getClass().isAnnotationPresent(UsesGuice.class)) { 
     final Injector injector = injectorHolder.getInjector(); 
     injector.injectMembers(ctx.getTarget()); 
    } 
    return ctx.proceed(); 
    } 
} 

GuiceInjectorHolderBean是负责触发guice布线的sinlgeton bean。需要注解类遵循

@Retention(RUNTIME) 
@Target(TYPE) 
@InterceptorBinding 
public @interface UsesGuice {} 

的JAX-WS POJO类

@UsesGuice 
@WebService(serviceName = "EchoServiceService", portName = "EchoServicePort", ame = "EchoServiceImpl", targetNamespace = "lala") 
public class EchoServiceImpl implements EchoService 
{ 
    @Inject 
    MyGuiceInjection injection; 

    @Override 
    @WebMethod 
    public String sayHello(final String msg) 
    { 
    return "Hello " + injection.call(msg); 
    } 
} 

在此先感谢 迪米特里

回答

0

你当前的方法

在你的代码,javax.interceptor注释@Interceptor@InterceptorBinding@AroundInvoke由CDI和EJB标准支持,而不是由Guice支持。 Guice使用专有的AOP通过org.aopalliance.intercept.MethodInterceptor接口进行拦截并调用方法AbstractModule.bindInterceptor

所以你想通过来引导你的端点吉斯注:

  1. 使用非吉斯拦截在端点上的方法
  2. @AroundInvoke方法中,编程调用吉斯Injector,以注射目标为截获端点

这要求Q,用什么1?

'Bootrap' 对于您目前的方法

的拦截机制,显然,一个EJB拦截器的工作原理,就像你说。

除了EJB或Guice AOP拦截器......一个明显的选择是标准的CDI拦截器。

但是,这将使它全部相当圆形和重量级......为什么使用CDI只是为了提升效率,以便您可以配置和执行到您想要的DI竞争对手:Guice?

建议的替代方案 - JAX-WS支持手动端点实例初始化

如果你想POJO Web服务,也许考虑反向跟踪,而不是拦截驱动吉斯初始化了一下,也许这可能是你需要什么:

javax.xml.ws.Endpoint.publish(String address, Object implementor) 

Endpoint.publish javadoc

初始化吉斯的标准方法,用injector.getInstance()到construc t您的端点实例,然后使用Endpoint.publish来针对端口设置端点实例。下面举一个很好的例子:

Using Guice 3 with JAX-WS in Java 6 outside web container