我在将Guice(@Inject
)存储库类注入@ManagedBean
类(JSF)时遇到问题,该类使用EntityManager
从db获取信息。我用很奇怪的方式阅读了很多旧文章,但没有任何效果。这是代码:
public class InitConfigListener extends GuiceServletContextListener {
@Override
protected Injector getInjector() {
return Guice.createInjector(new ServletModule() {
@Override
protected void configureServlets() {
install(new JpaPersistModule("db-manager"));
filter("/*").through(PersistFilter.class);
}
}, new RepositoryModule());
}
}
public class RepositoryModule extends AbstractModule {
public void configure() {
bind(IBookRepository.class).to(BookRepository.class).asEagerSingleton();
bind(IUserRepository.class).to(UserRepository.class).asEagerSingleton();
}
}
@ManagedBean
@ViewScoped
public class BooksView {
private List<Book> bookList;
private IBookRepository booksRepository;
public BooksView() { }
@Inject
public BooksView(IBookRepository booksRepository) {
this.booksRepository = booksRepository;
}
@PostConstruct
public void initBookList() {
bookList = booksRepository.getAll();
}
public List<Book> getBookList() {
return bookList;
}
public void setBookList(List<Book> bookList) {
this.bookList = bookList;
}
}
EntityManager被注入存储库。绑定存储库后,类@Inject
中的BooksView
未执行,@PostConstruct
已注册并且存储库为空。
感谢您的帮助。
答案 0 :(得分:0)
与BalusC提到的相比,Guice与CDI的工作方式略有不同。
正在发生的事情是CDI正在正确执行并在方法上调用post构造。 JSF类也不是Guice管理但是CDI管理所以你需要从你的前端调用guice(这是正确的),除非你使用基于servlet的web前端,你使用 guice-servlet 可以绕过这个。方法注释还需要 aopalliance 。
如果要在@PostConstruct之前启动,可以通过过滤器(例如:https://github.com/GedMarc/JWebSwing-Undertow/blob/master/src/main/java/za/co/mmagon/jwebswing/undertow/UndertowJWebSwingHandlerExtension.java)为基于底层的容器初始化Guice,或者如此处所述(https://github.com/google/guice/wiki/ServletModule)初始化为ServletContextListener。 JSF视图。
有趣的是,在EE环境中,@ SingleConstruct的时序在@ Singleton中是不同的。在独立环境中,您可以将注入构建器放在此位置以加载ejb和servlet的注入(来自战争中的模块)
答案 1 :(得分:0)
只要适当配置JSF,就可以使用Guice
https://search.maven.org/artifact/com.jwebmp.guicedee.servlets/guiced-servlets-jsf/0.67.0.16/jar
<dependency>
<groupId>com.jwebmp.guicedee.servlets</groupId>
<artifactId>guiced-servlets-jsf</artifactId>
<version>0.67.0.16</version>
</dependency>
在faces-config.xml中(位于WEB-INF下)
<?xml version="1.0" encoding="UTF-8"?>
<faces-config version="2.1" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_1.xsd">
<factory>
<application-factory>com.jwebmp.guicedservlets.jsf.FacesApplicationFactoryWrapper</application-factory>
</factory>
</faces-config>
然后您可以在所有注入中使用@ManagedBean和/或@Named(JSF2.4)适当地
可以在https://www.jwebmp.com中找到有关使用集中式喷油器的完整使用指南,在此处https://github.com/GedMarc/JWebMP-Examples-Undertow-HelloWorldJSF中可以找到示例
该实现是独立的,不需要运行jwebmp。