在web容器外部的Java6中使用Guice3和JAX-WS

在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注释类的端点

在这种情况下,我们使用基于JSR-330的注入来配置我们的独立Java6应用程序,这对于跨所有层获取配置参数非常有效

我们使用JAX-WSWeb服务已有相当长的一段时间了,在web容器中使用了第一个独立的Metro发行版,其中包含Java5,但在Java6中,我们只使用Endpoint类来获得较小的占用空间

所以现在我的处境是

  • 独立Java 6应用程序-无servlet容器(Jetty、Tomcat)
  • 我喜欢的Guice 3喷油器
  • 处理我的
    @javax.jws.WebService
    注释类的
    端点
    ,它将我的方法公开为web服务
我希望web服务方法要么透明地处理@Inject字段,要么访问injector。我可以从main方法中获取一个静态字段,但是我想要一个更干净的解决方案

有什么建议吗

(据我了解,该模块不适用于Guice 3,建议的解决方案是Tomcat特有的)


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);
    }
}