我正在尝试使用Guice来注入JSF托管bean的属性.这一切都在Google App Engine上运行(可能重要也可能不重要)
我按照这里的说明操作:
http://code.google.com/docreader/#p=google-guice&s=google-guice&t=GoogleAppEngine
一个问题是第一步.我无法继承Servlet模块并在那里设置我的servlet映射,因为Faces由javax.faces.webapp.FacesServlet处理,它是Servlet的子类,而不是HttpServlet.因此,我尝试将我的servlet配置保留在web.xml文件中,并在第二步中描述的上下文侦听器中创建注入器时,简单地实例化一个新的ServletModel()以及我的业务模块.
完成所有这些以及web.xml配置后,我的托管bean没有注入任何属性.方法如下
@ManagedBean
@ViewScoped
public class ViewTables implements Serializable
{
private DataService<Table> service;
@Inject
public void setService( DataService<Table> service )
{
this.service = service;
}
public List<Table> getTables()
{
return service.getAll();
}
}
Run Code Online (Sandbox Code Playgroud)
所以,我想知道是否有一个技巧让Guice注入JSF托管bean?我显然不能使用构造函数注入,因为JSF需要一个no-arg构造函数来创建bean.
假设我有一个ClassWithManyDependencies.我想为这个类编写一个Guice Provider,以便在我的程序中多次创建一个类的新实例(另一个类将依赖于这个Provider并在几个点使用它来创建新实例).
实现此目的的一种方法是让Provider依赖于ClassWithManyDependencies的所有依赖项.这很难看.
有没有更好的方法来实现这一目标?
注意 - 我当然不希望Provider依赖注入器.我考虑的另一个选择是让ClassWithManyDependencies和ClassWithManyDependenciesProvider扩展相同的基类,但它很难看.
在我的web.xml中我有
<filter>
<filter-name>authFilter</filter-name>
<filter-class>com.mystuff.AuthFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>authFilter</filter-name>
<servlet-name>requestFactoryServlet</servlet-name>
</filter-mapping>
<!-- Servlets -->
<servlet>
<servlet-name>requestFactoryServlet</servlet-name>
<servlet-class>com.google.web.bindery.requestfactory.server.RequestFactoryServlet</servlet-class>
<init-param>
<param-name>symbolMapsDirectory</param-name>
<!-- You'll need to compile with -extras and move the symbolMaps directory
to this location if you want stack trace deobfuscation to work -->
<param-value>WEB-INF/classes/symbolMaps/</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>requestFactoryServlet</servlet-name>
<url-pattern>/gwtRequest</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)
我试图将其转换为使用Guice Servlet配置而不是web.xml配置.
我无法弄清楚如何在Guice中完成相同的操作.我只看到如何过滤模式的示例,而不是特定的servlet.
我的申请是扔:
java.lang.RuntimeException: Deferred binding failed for 'com.mygwtapp.client.gin.ClientAppGinjector' (did you forget to inherit a required module?)
Run Code Online (Sandbox Code Playgroud)
在EntryPoint内的这段代码上:
private final ClientAppGinjector injector = GWT.create(ClientAppGinjector.class);
Run Code Online (Sandbox Code Playgroud)
可能是什么问题呢?
这是完整的错误日志:
java.lang.RuntimeException: Deferred binding failed for 'com.mygwtapp.client.gin.ClientAppGinjector' (did you forget to inherit a required module?)
at com.google.gwt.dev.shell.GWTBridgeImpl.create(GWTBridgeImpl.java:53)
at com.google.gwt.core.client.GWT.create(GWT.java:97)
at com.mygwtapp.client.MainEntryPoint.<init>(MainEntryPoint.java:79)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at com.google.gwt.dev.shell.ModuleSpace.rebindAndCreate(ModuleSpace.java:465)
at com.google.gwt.dev.shell.ModuleSpace.onLoad(ModuleSpace.java:375)
at com.google.gwt.dev.shell.OophmSessionHandler.loadModule(OophmSessionHandler.java:200)
at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:525)
at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:363)
at java.lang.Thread.run(Thread.java:722)
Run Code Online (Sandbox Code Playgroud) 我想为其中一个组件使用Guice的静态实例方法(非托管bean应该能够访问此类).我创建了这样的东西:
public class LookupService {
@Inject
private static Provider<Injector> injector = null;
private final ILookup<IWS> lookup;
@Inject
public LookupService(ILookup<IWS> lookup) {
this.lookup = lookup;
}
public static LookupService instance() {
return injector.get().getInstance(LookupService.class);
}
public <T extends IWS> T lookup(Class<T> localInterface) {
return lookup.lookup(localInterface);
}
Run Code Online (Sandbox Code Playgroud)
}
你怎么看待这个设计?关于这个的任何其他想法?(从非托管对象访问托管bean)
我正在努力创造一个Multibinder<A<? extends B>>.我试过用Multibinder.newSetBinder(binder(), A.class).第二个参数是Class<T>这样做我的guice模块给我一个类型不匹配错误.
Multibinder<A<? extends B>> multibinder = Multibinder.newSetBinder(binder(), A.class)
是否可以绑定这些通用集合?也许我可以使用另一种Multibinder?有没有人有任何想法?
尝试使用Guice注入构造函数时,我有一个非常奇怪的错误.构造函数中有一个特定的行如下:
@Inject
public RoundRobinAssigner(
... arguments
) {
...stuff
assignments = Sets.synchronizedNavigableSet(Sets.<CountingEntry<String>>newTreeSet());
}
Run Code Online (Sandbox Code Playgroud)
注射时,这会失败.
1) Error injecting constructor, java.lang.NoSuchMethodError: com.google.common.collect.Sets.synchronizedNavigableSet(Ljava/util/NavigableSet;)Ljava/util/NavigableSet;
at edu.harvard.econcs.turkserver.util.RoundRobinAssigner.<init>(RoundRobinAssigner.java:46)
at edu.harvard.econcs.turkserver.util.RoundRobinAssigner.class(RoundRobinAssigner.java:40)
while locating edu.harvard.econcs.turkserver.util.RoundRobinAssigner
Run Code Online (Sandbox Code Playgroud)
但是,如果我删除Sets.synchronizedNavigableSet()包装,事情注入就好了.
@Inject
public RoundRobinAssigner(
... arguments
) {
...stuff
assignments = Sets.<CountingEntry<String>>newTreeSet();
}
Run Code Online (Sandbox Code Playgroud)
显然,这是次优的,因为我想使用同步集.有没有理由为什么Guice所谓的教练会表现得与正常教练不同?这些代码都没有任何编译问题,而且Setsguava中的类也已经被加载了,所以我不知道是什么导致了这个.
我有一个看起来像这样的构造函数:
@Inject
public MyClass(
@Named("config") String configFile,
@Named("template") String templateFile,
CachedSettings settings,
@Assisted String channelId,
@Nullable @Assisted("NetworkA") NetworkInterface localNetworkInterfaceA,
@Nullable @Assisted("NetworkB") NetworkInterface localNetworkInterfaceB) {
Run Code Online (Sandbox Code Playgroud)
我得到以下错误(两次,每个参数一次)
1) null returned by binding at my.company.package.MyClassFactory.create()
but parameter 4 of my.company.package.MyClass.<init>() is not @Nullable
while locating java.net.NetworkInterface annotated with @com.google.inject.assistedinject.Assisted(value=NetworkA)
for parameter 4 at my.company.package.MyClass.<init>(MyClass.java:24)
while locating my.company.package.MyClass annotated with interface com.google.inject.assistedinject.Assisted
Run Code Online (Sandbox Code Playgroud)
知道什么是错的吗?我在这个问题上发现了另外两个问题,其中一个说这是一个依赖性问题,我认为我没有,另一个说这是一个Eclipse问题,我确实使用过,但我刷新,清理并重建了我的问题. maven项目从头开始,所以我不确定问题是什么.
我正在使用javax.annotation.Nullable,它应该在运行时保留.我还应该尝试什么?
我是Google Guice的新手,需要一点帮助。我创建了一个像这样的模块:
public interface Foo {
Bar doSomething();
}
public class MyFoo implements Foo {
Bar doSomething() {
// create an instance of MyBar
}
}
public interface Bar {
void run();
}
public interface MyBar implements Bar {
void run();
}
public class MyModule extends AbstractModule {
@Override
protected void configure() {
bind(Foo.class).to(MyFoo.class);
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:在类“ MyFoo”中创建MyBar实例的正确方法是什么?只是这样做是错误的:
public class MyFoo implements Foo {
Bar doSomething() {
MyBar mybar = new MyBar();
return mybar;
}
}
Run Code Online (Sandbox Code Playgroud)
是否可以在需要时通过MyModule注入MyBar的新实例,还是必须在MyBar的构造函数中注入工厂才能创建MyBar实例?如果必须使用工厂,是否可以控制通过模块生成的实现?
整个互联网解析,但无法弄清楚为什么会发生这种情况.我有一个最简单的项目(通过jersey-quickstart-grizzly2原型)和一个Jersey资源.我正在使用Guice作为DI,因为CDI也不想和Jersey一起工作.问题是Guice无法解析在Jersey资源中注入时要使用的类.它在外面很好用,但不适用于泽西岛.这是泽西岛资源:
import com.google.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("api")
public class MyResource {
private Transport transport;
@Inject
public void setTransport(Transport transport) {
this.transport = transport;
}
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getIt() {
return transport.encode("Got it!");
}
}
Run Code Online (Sandbox Code Playgroud)
传输接口:
public interface Transport {
String encode(String input);
}
Run Code Online (Sandbox Code Playgroud)
它的实现:
public class TransportImpl implements Transport {
@Override
public String encode(String input) {
return "before:".concat(input).concat(":after");
}
}
Run Code Online (Sandbox Code Playgroud)
按照Google的GettingStarted手册,我继承AbstractModule并绑定了我的类,如下所示:
public class TransportModule extends AbstractModule {
@Override
protected void configure() { …Run Code Online (Sandbox Code Playgroud)