在web容器外部的Java6中使用Guice3和JAX-WS
在这种情况下,我们使用基于JSR-330的注入来配置我们的独立Java6应用程序,这对于跨所有层获取配置参数非常有效 我们使用JAX-WSWeb服务已有相当长的一段时间了,在web容器中使用了第一个独立的Metro发行版,其中包含Java5,但在Java6中,我们只使用Endpoint类来获得较小的占用空间 所以现在我的处境是在web容器外部的Java6中使用Guice3和JAX-WS,java,dependency-injection,jax-ws,guice,Java,Dependency Injection,Jax Ws,Guice,在这种情况下,我们使用基于JSR-330的注入来配置我们的独立Java6应用程序,这对于跨所有层获取配置参数非常有效 我们使用JAX-WSWeb服务已有相当长的一段时间了,在web容器中使用了第一个独立的Metro发行版,其中包含Java5,但在Java6中,我们只使用Endpoint类来获得较小的占用空间 所以现在我的处境是 独立Java 6应用程序-无servlet容器(Jetty、Tomcat) 我喜欢的Guice 3喷油器 处理我的@javax.jws.WebService注释类的端点
- 独立Java 6应用程序-无servlet容器(Jetty、Tomcat)
- 我喜欢的Guice 3喷油器
- 处理我的
注释类的@javax.jws.WebService
,它将我的方法公开为web服务李>端点
JSR-250
@Resource
注释在这里有用吗?您需要使用AbstractMultiInstanceResolver
扩展点
创建注释GuiceManaged
@Retention(RUNTIME)
@Target(TYPE)
@Documented
@WebServiceFeatureAnnotation(id=GuiceManagedFeature.ID, bean=GuiceManagedFeature.class)
@InstanceResolverAnnotation(GuiceManagedInstanceResolver.class)
public @interface GuiceManaged {
}
实现GuiceManagedFeature
,即WebServiceFeature
:
public class GuiceManagedFeature extends WebServiceFeature {
public static final String ID="FEATURE_GuiceManaged";
@FeatureConstructor
public GuiceManagedFeature()
{
this.enabled=true;
}
public String getID() {
return ID;
}
}
通过扩展AbstractMultiInstanceResolver
public class GuiceManagedInstanceResolver extends AbstractMultiInstanceResolver {
private T instance=null;
public GuiceManagedInstanceResolver(@NotNull Class clazz)
{
super(clazz);
}
public T resolve(@NotNull Packet request) {
if(instance==null)
{
instance=create();
Injector injector= Guice.createInjector(new WebServiceModule());
injector.injectMembers(instance);
}
return instance;
}
}
现在,使用
@GuiceManaged
,为您的业务方法中的方法级DI使用@Inject
,为您的服务添加注释。我不确定我是否理解了问题的每一点。对于+500赏金来说,这看起来太容易了。请张贴一些代码,如果这不是你要搜索的
总之,一个简单的解决方案创建了一个带有依赖注入的web服务:
final Module module = new HelloModule();
final Injector injector = Guice.createInjector(module);
final HelloService helloService = injector.getInstance(HelloService.class);
Endpoint.publish("http://localhost:8080/helloService", helloService);
下面是一个基于Marcus Eriksson的代码的更复杂的类路径扫描()解决方案。它将使用@GuiceManaged
注释的所有类发布为带有Endpoint.publish()的Web服务
以及HelloServiceImpl
代码段:
@GuiceManaged(module = HelloModule.class,
address = "http://localhost:8080/helloService")
@WebService
public class HelloServiceImpl implements HelloService {
@Inject // bound in HelloModule
public GreetingsService greetingsService;
@Override
@WebMethod
public String sayHello(final String name) {
return greetingsService.sayHello(name);
}
}
你的灵感来自于?@ThorbjørnRavnAndersen是的,很久以前,我们遇到过类似于你的问题,我们试图将该博客用作参考,然后我们在Guice 2.x中找到了Guice Fruit。这是否意味着你现在使用Guice Fruit,必须继续使用Guice 2?在仔细思考你的答案后,我意识到端点机制不做任何新的,只是调用@WebMethod注释的方法。这意味着我现在只需要在实例中注入提供者就可以了。和往常一样,有些问题只有在你知道怎么做之前是很难回答的。而且我经常用500分奖金来吸引别人对一个问题的注意。如果其他人觉得问题简单而答案无关紧要,那我也没问题。事实证明,我现在可以通过在实现对象中注入一个提供程序来解决问题,因为我不需要深度嵌套注入。赏金的奖励让我意识到了这一点。
@Retention(RUNTIME)
@Target(TYPE)
@Documented
public @interface GuiceManaged {
public Class<? extends Module>[] module();
public String address();
}
@GuiceManaged(module = HelloModule.class,
address = "http://localhost:8080/helloService")
@WebService
public class HelloServiceImpl implements HelloService {
@Inject // bound in HelloModule
public GreetingsService greetingsService;
@Override
@WebMethod
public String sayHello(final String name) {
return greetingsService.sayHello(name);
}
}