我正在尝试使用Guice 3.0AssistedInject
,它不会实例化工厂。
SSCCE代码:
public class ParentClass() {
@Inject private MyFactory myFactory;
private final Foo foo;
private final Bar bar;
public ParentClass() {
if(myFactory == null) System.err.println("Error: I should have injected by now!");
foo = myFactory.create(new Map<String, Object>());
// etc.
}
}
public interface MyFactory {
Foo create(Map<String, Object> mapA);
Bar create(Map<String, Object> mapB, Map<String, Object> mapC);
}
public class ParentModule extends AbstractModule {
@Override
protected void configure() {
install(new FactoryModuleBuilder()
.implement(Foo.class, FooImpl.class)
.implement(Bar.class, BarImpl.class)
.build(MyFactory.class));
}
public class FooImpl implements Foo {
private final Map<String, Object> mapA;
@AssistedInject
public FooImpl(@Assisted Map<String, Object> mapA) {
this.mapA = mapA;
}
}
< code>BarImpl与< code>FooImpl非常相似。这里出了什么问题?还要注意,我在这里尝试了< code>@AssistedInject和< code>@Inject,两者都会导致错误。
输出:
Error: I should have injected by now!
Exception in thread "main" com.google.inject.ProvisionException: Guice provision errors:
1) Error injecting constructor, java.lang.NullPointerException
at ParentClass.<init>(ParentClass.java:7)
while locating com.my.package.ParentClass
1 error
at com.google.inject.internal.InjectorImpl$4.get(InjectorImpl.java:987)
at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1013)
at com.my.package.ParentMain.main(ParentMain.java:16)
Caused by: java.lang.NullPointerException
at com.my.package.ParentClass.<init>(ParentClass.java:9)
at com.my.package.ParentClass$$FastClassByGuice$$d4b3063a.newInstance(<generated>)
at com.google.inject.internal.cglib.reflect.$FastConstructor.newInstance(FastConstructor.java:40)
... 8 more
请注意,第 9 行是对 myFactory.create()
的第一次调用的行
两件事。要在构造函数中使用注入,必须使用构造函数注入:
public class ParentClass {
private final Foo foo;
private final Bar bar;
@Inject
public ParentClass(MyFactory myFactory) {
if(myFactory == null) System.err.println("Error: I should have injected by now!");
this.foo = myFactory.create(new HashMap<String, Object>());
this.bar = myFactory.create(new HashMap<String, Object>(), new HashMap<String, Object>());
}
}
此外,由于您的工厂有两个相同类型的参数,因此需要命名它们:
public interface MyFactory {
Foo create(Map<String, Object> mapA);
Bar create(@Assisted("B") Map<String, Object> mapB, @Assisted("C") Map<String, Object> mapC);
}
和
public class BarImpl implements Bar {
private final Map<String, Object> mapA;
private final Map<String, Object> mapB;
@AssistedInject
public BarImpl(@Assisted("B") Map<String, Object> mapA, @Assisted("C") Map<String, Object> mapB) {
this.mapA = mapA;
this.mapB =mapB;
}
}
根据Guice的javadoc,字段注入是在构造函数注入之后进行的。
我假设您的 ParentClass
实例是由 Guice 创建的。执行 ParentClass
的构造函数时,尚未注入其 myFactory
字段。
我正在使用以下依赖项: 创建了新的测试类: 我在Spring Boot中创建了测试用例,但是我得到了这个错误: 这是我的应用程序类: 知道我为什么不能在测试类中注入bean吗? 我按照建议删除了@ContextConfiguration,@ComponentScan,@ConnecationTes现在我看到了不同的异常:
8.3. 会话注入 一个与会话暴露类似的问题是会话注入。此类攻击是基于你的WEB服务器除了对会话存储目录有读取权限外,还有写入权限。因此,存在着编写一段允许其他用户添加,编辑或删除会话的脚本的可能。下例显示了一个允许用户方便地编辑已存在的会话数据的HTML表单: <?php session_start(); ?> <form action="inject.php" method="POST"> <
我有这个问题,我不确定这是否是“预期”行为,但我的问题是: 我有一个Http筛选器: UserInfo和ActivationInfo都是@SessionScope,如下所示: 和 当我尝试访问调用过滤器的页面时,我在控制台上看到以下内容: 如果我转到不同的浏览器并输入“坏”校验码,用户信息/激活信息永远不会重新注入。IE,与不同的会话,我没有看到一个新的UserInfo/ActivationInf
问题内容: 当我尝试将$ http注入到覆盖的工厂中时,出现错误: 未捕获的错误:[$ injector:cdep]找到循环依赖项:$ http <-$ exceptionHandler <-$ rootScope 任何想法如何解决?如果我使用[]注入,则$ http是未定义的 编辑 ___ _ ___ ___ _ 根据下面的答案,我尝试了: 但我仍然收到循环错误: 未捕获的错误:[$ injec
问题内容: 我使用SpringBeanAutowiringSupport在某些对象中进行bean注入。问题是,在jUnit测试中无法注入bean。为了进行测试,使用了SpringJUnit4ClassRunner。 有谁知道,为什么使用注入在jUnit测试中不起作用? 问题答案: 感谢M. Denium的帮助,他的解决方案得以奏效。
问题内容: 分析了整个互联网,但无法弄清楚为什么会发生这种情况。我有一个最简单的项目(使用jersey-quickstart- grizzly2原型),并且只有一个Jersey资源。我将Guice用作DI,因为CDI也不想与Jersey合作。问题在于,Guice在注入Jersey的资源时无法解析要使用的类。它在外面很好用,但不适用于泽西岛。这是泽西岛的资源: 传输接口: 它的实现: 遵循Googl