我正在使用JBoss 7.1和Java 1.6。
我想通过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 :(得分:0)
您当前的方法
在您的代码中,javax.interceptor
注释@Interceptor
,@InterceptorBinding
和@AroundInvoke
受CDI和EJB标准支持,而不受Guice支持。 Guice通过org.aopalliance.intercept.MethodInterceptor
接口使用专有AOP拦截并调用方法AbstractModule.bindInterceptor
。
所以你试图通过以下方式在端点上引导Guice注入:
@AroundInvoke
方法中,以编程方式调用Guice Injector
,注入目标为截获的端点那要求Q,1用什么?
用于当前方法的'Bootrap'拦截机制
显然,正如您所说,EJB拦截器正常工作。
除了EJB或Guice AOP拦截器之外......一个明显的替代方案是标准的CDI拦截器。
但这会让它变成圆形和重量级......为什么只使用CDI来提升,这样你就可以配置并执行你想要的DI竞争对手:Guice?
建议的替代解决方案 - JAX-WS支持手动端点实例初始化
如果你想要POJO网络服务,也许可以考虑回溯一点,而不是拦截驱动的Guice初始化,也许这可能是你需要的:
javax.xml.ws.Endpoint.publish(String address, Object implementor)
以标准方式初始化Guice,使用injector.getInstance()
构建端点实例,然后使用Endpoint.publish
针对端口设置端点实例。以下是一个很好的例子: