Jboss 将Guice注入JAX-WSPOJO

Jboss 将Guice注入JAX-WSPOJO,jboss,jax-ws,guice,Jboss,Jax Ws,Guice,我正在使用JBoss7.1和Java1.6 我希望通过JAX-WS端点将服务与集成。使用Gunnar.Morling描述的拦截器模式,当使用无状态bean作为Web服务时,我能够正确地实例化GUI模块。然而,我不能用一个简单的POJO注释的Web服务来做同样的事情。这是否可能?是否有人找到了解决方法。以下是我迄今为止所做努力的总结 @UsesGuice @Interceptor public class GuiceInterceptor { @Inject private GuiceI

我正在使用JBoss7.1和Java1.6

我希望通过JAX-WS端点将服务与集成。使用Gunnar.Morling描述的拦截器模式,当使用无状态bean作为Web服务时,我能够正确地实例化GUI模块。然而,我不能用一个简单的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-WSPOJO类

@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);
  }
}
提前谢谢
迪米特里

您当前的方法

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

因此,您试图通过以下方式在端点上引导Guice注入:

  • 在端点的方法上使用非Guice拦截器
  • @AroundInvoke
    方法中,以编程方式调用Guice
    Injector
    ,注入目标是截获的端点
  • 这就引出了Q,1用什么

    针对当前方法的“Bootrap”拦截机制

    显然,正如您所说的,EJB拦截器是有效的

    除了EJB或Guice AOP拦截器。。。一个明显的替代方案是标准的CDI拦截器

    但这会使它变得更圆更重。。。为什么使用CDI只是为了增强功能,这样您就可以配置和执行您想要的DI竞争对手:Guice

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

    如果你想要Pojo Web服务,也许考虑回溯一点,而不是由截击机驱动的Guice初始化,也许这就是你需要的:

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

    以标准方式初始化GUI,使用
    injector.getInstance()
    构造端点实例,然后使用
    endpoint.publish
    针对端口设置端点实例。以下是一个很好的例子: