gpt4 book ai didi

jsf - 如何在@FacesConverter 中注入(inject)@EJB、@PersistenceContext、@Inject、@Autowired 等?

转载 作者:行者123 更新时间:2023-12-03 09:49:06 26 4
gpt4 key购买 nike

如何注入(inject)像 @EJB 这样的依赖项, @PersistenceContext , @Inject , @AutoWired等在 @FacesConverter ?在我的特定情况下,我需要通过 @EJB 注入(inject) EJB :

@FacesConverter
public class MyConverter implements Converter {

@EJB
protected MyService myService;

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
// myService.doSomething
}

}

但是,它没有被注入(inject),它仍然是 null ,导致 NPE。看来 @PersistenceContext@Inject也不起作用。

如何在我的转换器中注入(inject)服务依赖项以便我可以访问数据库?

最佳答案

Can I use @EJB to inject my service into a @FacesConverter?



不,直到 JSF 2.3 发布。 JSF/CDI 人员正在为 JSF 2.3 做这方面的工作。另见 JSF spec issue 1349和这个相关的 "What's new in JSF 2.3?"我的同事 Arjan Tijms 的文章。只有像 @EJB 这样的依赖注入(inject), @PersistenceContext , @Inject等将在 @FacesConverter 中工作当您明确添加 managed=true注释的属性。
@FacesConverter(value="yourConverter", managed=true)
public class YourConverter implements Converter {

@Inject
private YourService service;
// ...
}

If not, what's the "correct" way to do this?



在 JSF 2.3 之前,您有几种选择:
  • 改为使其成为托管 bean。您可以通过 @ManagedBean 使其成为 JSF、CDI 或 Spring 托管 bean , @Named@Component .下面的示例使其成为 JSF 托管 bean。
    @ManagedBean
    @RequestScoped
    public class YourConverter implements Converter {

    @EJB
    private YourService service;
    // ...
    }

    下面的示例使其成为 CDI 托管 bean。
    @Named
    @RequestScoped
    public class YourConverter implements Converter {

    @Inject
    private YourService service;
    // ...
    }

    将其引用为 <h:inputXxx converter="#{yourConverter}">而不是 <h:inputXxx converter="yourConverter"> ,或作为 <f:converter binding="#{yourConverter}">而不是 <f:converter converterId="yourConverter"> .不要忘记删除 @FacesConverter注解!

    缺点是不能指定forClass因此需要在必要时在 View 中的任何地方手动定义转换器。
  • 而是将其注入(inject)常规托管 bean。
    @ManagedBean
    @RequestScoped
    public class YourBean {

    @EJB
    private YourService service;
    // ...
    }

    在您的转换器中,通过 EL 抓取或调用它。
    YourBean yourBean = context.getApplication().evaluateExpressionGet(context, "#{yourBean}", YourBean.class);

    // Then e.g. either
    YourEntity yourEntity = yourBean.getService().findByStringId(value);
    // Or
    YourEntity yourEntity = yourBean.findEntityByStringId(value);

    这样你就可以继续使用 @FacesConverter .
  • 从 JNDI 手动获取 EJB。
    YourService yourService = (YourService) new InitialContext().lookup("java:global/appName/YourService");

    缺点是存在一定的风险,即不完全便携。另见 Inject EJB bean from JSF managed bean programmatically .
  • 安装 OmniFaces .从 1.6 版开始,它透明地增加了对 @EJB 的支持。 (和 @Inject )在 @FacesConverter没有任何进一步的修改。另见 the showcase .如果您碰巧需要 <f:selectItem(s)> 的转换器,那么另一种方法是使用它的SelectItemsConverter它将根据选择的项目自动执行转换作业,而无需任何数据库交互。
    <h:selectOneMenu ... converter="omnifaces.SelectItemsConverter">

    另见 Conversion Error setting value for 'null Converter' .

  • 也可以看看:
  • How to inject in @FacesValidator with @EJB, @PersistenceContext, @Inject, @Autowired
  • CDI Injection into a FacesConverter
  • Getting an @EJB in a @FacesValidator and @FacesConverter
  • 关于jsf - 如何在@FacesConverter 中注入(inject)@EJB、@PersistenceContext、@Inject、@Autowired 等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7665673/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com