【问题标题】:FacesConverter Inject workaround - constructor alternativeFacesConverter Inject 解决方法 - 构造函数替代
【发布时间】:2013-10-18 17:57:06
【问题描述】:

这与 JSF FacesConverter 不是 CDI 的合格 @Inject 目标的已知问题的解决方法有关。我遵循了CDI Injection into a FacesConverter 的解决方法。然而,在我的 FacesConverter 中,我一直在利用将对象的类传递给构造函数的特性。

来自javadoc - “如果转换器有一个带 Class 实例的单参数构造函数,并且要转换的数据的 Class 在转换器实例化时是已知的,则必须使用此构造函数来实例化转换器,而不是零参数版本。”这与 CDI 对“正常范围”bean 的要求直接冲突,其中允许使用无参数或 @Inject 带注释的构造函数。

总之,我想使用一个可以进行 CDI 注入的转换器,并且可以在运行时访问正在转换的对象的类。

我在带有 Weld 2.0.4 的 Glassfish 4 上使用 Mojarra 2.2.4。

【问题讨论】:

  • 您是否阅读了您自己找到的答案的“更新”部分?
  • 我有。我希望得到一些不涉及引入更多库的东西。但总的来说,这可能比我开始考虑的黑客更干净。谢谢鲍克
  • OmniFaces 不仅仅是一个库 :) 里面有很多东西可以极大地帮助减少/简化 JSF 代码。
  • 其实 OmniFaces 主页说它是一个“实用程序库”。
  • 我将检查 Omnifaces,但将额外的依赖项保持在最低限度是一个优先事项。我可能采用的替代方法是保留 FacesConverter 声明,但使用通过 CDI BeanManager 的显式查找来替换非功能性 Inject 注释。如果这个问题可以在 JSF 中解决就好了。已经有一段时间了...

标签: jsf cdi inject


【解决方案1】:

对于那些可能对此替代方案感兴趣的人,我可以通过构造函数中的 BeanManager 将 Inject 注释替换为编程查找。精简代码如下。我没有进行性能测试,并怀疑这可能是一个缺点。如果时间允许,我将与 Omnifaces 解决方案进行比较。

编辑: BeanManager 查找的成本被证明是最小的。构造函数平均耗时

@FacesConverter(forClass = AbstractEntity.class)
public class EntityConverter implements Converter {

    private LocationService locationService;
    private Class entityClass;

    //Special parameterized constructor for @FacesConverter described in the original question
    public EntityConverter(Class entityClass) throws NamingException {
            this.entityClass = entityClass;
            this.locationService = loadManagedBean(LocationService.class, "locationService");
        }

    //Generic lookup method for @Named managed beans
    protected <T> T loadManagedBean(Class<T> clazz, String beanName) throws NamingException {
            InitialContext initialContext = new InitialContext();
            BeanManager bm = (BeanManager) initialContext.lookup("java:comp/BeanManager");

            Bean<T> bean = (Bean<T>) bm.getBeans(beanName).iterator().next();
            CreationalContext<T> cc = bm.createCreationalContext(bean);
            T beanInstance = (T) bm.getReference(bean, clazz, cc);
            return beanInstance;
    }
}

【讨论】:

    猜你喜欢
    • 2020-09-20
    • 2014-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    相关资源
    最近更新 更多