是否有一些方法可以使用JAX-WS创建SOAP Web服务类,并将它们注入Guice 3.0(guice-persist)事务,甚至只是简单的依赖注入? guiceyfruit软件包提供了一个@GuiceManaged注释,使Guice 2.0成为可能,但guiceyfruit(来自我的测试)似乎与Guice 3不兼容,我认为该项目不再活跃。
也许是因为有另一种方法可以做到这一点?也许是JSR的标准方式?
答案 0 :(得分:1)
在我的日志中发现了一些错误,这些错误与guicyfruit调用2.0内部不再存在的3.0内部相关。从GuiceManaged代码中,它实际上只是一个guicyfruit调用,所以我决定撕掉依赖项并四处寻找替代方案。
http://code.google.com/p/guice-recipes/有一个分叉,如果用来代替guicyfruit,可能会也可能不会解决问题。
我使用http://code.google.com/p/google-guice/issues/detail?id=288#c69代码并将其用作GuiceManagedInstanceResolver中的新dispose()方法。
我现在在我的代码中处理Guice注入和方面,并且没有与丢失方法和/或内存泄漏相关的日志输出。
答案 1 :(得分:1)
我前一段时间遇到过同样的问题,我看了一下Guicyfruit代码并决定提取我需要的东西。这导致了三个班级。
首先,我们需要一个注释,我们可以用它来注释我们的Web服务端点。
<强> GuiceManaged.java 强>
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.xml.ws.spi.WebServiceFeatureAnnotation;
import com.google.inject.Module;
import com.sun.xml.ws.api.server.InstanceResolverAnnotation;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@WebServiceFeatureAnnotation(id = GuiceManagedFeature.ID, bean = GuiceManagedFeature.class)
@InstanceResolverAnnotation(GuiceManagedInstanceResolver.class)
public @interface GuiceManaged {
Class<? extends Module>[] modules();
}
其次,我们需要上面注释中提到的GuiceManagedFeature。
<强> GuiceManagedFeature.java 强>
import javax.xml.ws.WebServiceFeature;
import com.sun.xml.ws.api.FeatureConstructor;
public class GuiceManagedFeature extends WebServiceFeature {
public static final String ID = "any.string.will.do.here";
@FeatureConstructor
public GuiceManagedFeature() {
this.enabled = true;
}
@Override
public String getID() {
return ID;
}
}
第三,我们创建了实际的解析器。
<强> GuiceManagedInstanceResolver.java 强>
import java.util.ArrayList;
import java.util.List;
import javax.xml.ws.WebServiceContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Module;
import com.sun.xml.ws.api.message.Packet;
import com.sun.xml.ws.api.server.WSEndpoint;
import com.sun.xml.ws.api.server.WSWebServiceContext;
import com.sun.xml.ws.server.AbstractMultiInstanceResolver;
public class GuiceManagedInstanceResolver<T> extends AbstractMultiInstanceResolver<T> {
private static final Logger LOGGER = LoggerFactory.getLogger(GuiceManagedInstanceResolver.class);
private static Injector injector;
private transient WSWebServiceContext webServiceContext;
public GuiceManagedInstanceResolver(final Class<T> clazz) {
super(clazz);
}
@Override
public T resolve(final Packet request) {
final T instance = injector.getInstance(this.clazz);
injector.injectMembers(instance);
return instance;
}
@SuppressWarnings("rawtypes")
@Override
public void start(final WSWebServiceContext wsWebServiceContext, final WSEndpoint endpoint) {
super.start(wsWebServiceContext, endpoint);
this.webServiceContext = wsWebServiceContext;
synchronized (GuiceManagedInstanceResolver.class) {
if (injector == null) {
final List<Module> moduleInstances = new ArrayList<Module>();
final Class<? extends Module>[] modules = this.clazz.getAnnotation(GuiceManaged.class).modules();
for (final Class<? extends Module> moduleClass : modules) {
try {
moduleInstances.add(moduleClass.newInstance());
} catch (final InstantiationException exception) {
LOGGER.error("Could not instantiate guice module [{}]", moduleClass.getName());
} catch (final IllegalAccessException e) {
LOGGER.error("Could not instantiate guice module [{}]", moduleClass.getName());
}
}
moduleInstances.add(new AbstractModule() {
@Override
protected void configure() {
this.bind(WebServiceContext.class).toInstance(GuiceManagedInstanceResolver.this.webServiceContext);
}
});
injector = Guice.createInjector(moduleInstances);
}
}
}
}
以上示例使用SLF4J进行日志记录,但您当然可以根据自己的意愿使用。