标签: guice

Guice和JSF 2

我正在尝试使用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.

jsf google-app-engine dependency-injection guice

2
推荐指数
1
解决办法
3400
查看次数

如何编写未明确创建对象的Guice Provider?

假设我有一个ClassWithManyDependencies.我想为这个类编写一个Guice Provider,以便在我的程序中多次创建一个类的新实例(另一个类将依赖于这个Provider并在几个点使用它来创建新实例).

实现此目的的一种方法是让Provider依赖于ClassWithManyDependencies的所有依赖项.这很难看.

有没有更好的方法来实现这一目标?

注意 - 我当然不希望Provider依赖注入器.我考虑的另一个选择是让ClassWithManyDependencies和ClassWithManyDependenciesProvider扩展相同的基类,但它很难看.

java dependency-injection guice

2
推荐指数
1
解决办法
1159
查看次数

如何在Guice Servlet中使用servlet-name进行过滤映射?

在我的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 servlets guice

2
推荐指数
1
解决办法
1491
查看次数

延迟绑定失败

我的申请是扔:

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)

gwt gwt-gin dependency-injection guice

2
推荐指数
1
解决办法
1万
查看次数

Guice的实例方法

我想为其中一个组件使用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)

dependency-injection instance guice

2
推荐指数
1
解决办法
1493
查看次数

使用泛型进行多重绑定

我正在努力创造一个Multibinder<A<? extends B>>.我试过用Multibinder.newSetBinder(binder(), A.class).第二个参数是Class<T>这样做我的guice模块给我一个类型不匹配错误.

Multibinder<A<? extends B>> multibinder = Multibinder.newSetBinder(binder(), A.class)

是否可以绑定这些通用集合?也许我可以使用另一种Multibinder?有没有人有任何想法?

java guice

2
推荐指数
1
解决办法
1229
查看次数

奇怪的Guice注射错误

尝试使用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中的类也已经被加载了,所以我不知道是什么导致了这个.

java constructor dependency-injection guice guava

2
推荐指数
1
解决办法
2294
查看次数

@Nullable似乎不适用于@AssistedInject

我有一个看起来像这样的构造函数:

@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,它应该在运行时保留.我还应该尝试什么?

java nullable guice assisted-inject

2
推荐指数
1
解决办法
1211
查看次数

如何在Google Guice中创建实现的实例

我是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实例?如果必须使用工厂,是否可以控制通过模块生成的实现?

java dependency-injection inject guice

2
推荐指数
1
解决办法
1913
查看次数

Guice没有注入Jersey的资源

整个互联网解析,但无法弄清楚为什么会发生这种情况.我有一个最简单的项目(通过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)

java rest dependency-injection jersey guice

2
推荐指数
1
解决办法
3860
查看次数