我正在尝试将 Guice 集成到 JSF 1.2 (Sun RI) 应用程序中,并且我希望能够对我的托管 beans 执行以下操作:
- 使用 Guice
@Inject
注解注入(inject)依赖,然后 - 使用
@PostConstruct
注解执行初始化
我的问题是 @PostConstruct
方法总是在处理 @Inject
注释之前被调用。有谁知道这个问题的解决方案吗?
托管bean:
public final class Foo {
@Inject private BazService bazService;
private Baz baz;
@PostConstruct
public void init() {
bar = bazService.loadBaz();
}
public void setBazService(BazService bazService) {
this.bazService = bazService;
}
}
托管 bean 声明:
<managed-bean>
<managed-bean-name>foo</managed-bean-name>
<managed-bean-class>bean.Foo</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>id</property-name>
<value>#{param.id}</value>
</managed-property>
</managed-bean>
Guice 绑定(bind):
public final class MyGuiceModule extends AbstractModule {
@Override
protected void configure() {
bind(BazService.class).to(DummyBazService.class).in(Scopes.SINGLETON);
}
}
我试过以下方法:
- manually invoking
Injector.injectMembers(Object)
(@PostConstruct
未在父类(super class)中处理) - using a custom
VariableResolver
(@PostConstruct
在@Inject
之前处理) - using MyFaces'
GuiceResolver
(只是似乎根本不起作用 - 可能与 this issue 有关)
如果这似乎是处理问题的错误方式,我很乐意考虑其他选择...感谢任何帮助。
编辑
我使用的是 Guice 1.0。我现在已经升级到 Guice 2.0,但问题仍然存在。我找到了 some discussion that seems to relate to my issue ...但我不明白如何使用这些信息:(
最佳答案
不幸的是,我没有给你答案,但我会这样说......
- manually invoking Injector.injectMembers(Object) (@PostConstruct isn't processed in superclass)
让对象 self 注入(inject)看起来可行——您不一定要使用父类(super class):
public final class Foo {
@Inject
private BazService bazService;
private Baz baz;
@PostConstruct
public void init() {
InjectorFinder.getInjector().injectMembers(this);
baz = bazService.loadBaz();
}
public void setBazService(BazService bazService) {
this.bazService = bazService;
}
}
我也认为没有理由保留对注入(inject)器的引用,因此考虑一个实用程序类:
public class InjectorFinder {
public static Injector getInjector() {
FacesContext facesContext = FacesContext
.getCurrentInstance();
ExternalContext extContext = facesContext
.getExternalContext();
Map<String, Object> applicationMap = extContext
.getApplicationMap();
return (Injector) applicationMap.get(Injector.class
.getName());
}
}
@PostConstruct 和序列化会发生什么吗?这是我没有考虑太多的事情,但它可能会影响 session bean。
- using a custom VariableResolver (@PostConstruct is processed before @Inject)
这看起来不像是一种可靠的技术。如果我没看错代码,每次解析对象时都会注入(inject)依赖项。
- using MyFaces' GuiceResolver (just did not appear to work at all - perhaps something to do with this issue)
我怀疑这个补丁存在我提到的问题(不同的解析器,同一作者,无论如何)。除了错误,尝试同时使用两种不同的 JSF 实现(Sun 和 Apache)是行不通的。
我在野外见过几个 Guice/JSF 项目(guicesf ;jsf-sugar ;也许还有更多?)但没有尝试过,所以我不知道它们是否对您有帮助,甚至不知道如何他们很稳定。
无论您做什么,都可以关注 Web Beans。 (概述 here)因为这可能会影响 JSF 中 future 的 bean 处理功能(如果我正确理解 Guice 在堆栈中的位置,您可以使用它来实现 Web Beans - 不是我推荐的你这样做)。
关于java - 注入(inject)后初始化(JSF 1.2 + Guice),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/886114/