在Guice中注入ManagedBean JSF

时间:2016-02-04 17:36:54

标签: jsf guice

我在将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已注册并且存储库为空。

感谢您的帮助。

2 个答案:

答案 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。