Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf FacesConverter注入解决方案-构造函数替代方案_Jsf_Cdi_Inject - Fatal编程技术网

Jsf FacesConverter注入解决方案-构造函数替代方案

Jsf FacesConverter注入解决方案-构造函数替代方案,jsf,cdi,inject,Jsf,Cdi,Inject,这与JSF FacesConverter不是CDI的合格@Inject目标的已知问题的解决方法有关。我在一次会议上遵循了解决办法。然而,在我的FacesConverter中,我一直在利用将对象的类传递给构造函数的特性 从“如果转换器有一个采用类实例的单参数构造函数,并且要转换的数据的类在转换器实例化时已知,则必须使用此构造函数来实例化转换器,而不是零参数版本。”这与CDI对“正常范围”的要求直接冲突在bean中,只允许使用无arg或@Inject注释的构造函数 总之,我想使用一个转换器,它可以接

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

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

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


我在Glassfish 4上使用Mojarra 2.2.4和Weld 2.0.4。

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


编辑:BeanManager查找的成本被证明是最低的。构造器的平均花费你读过你自己找到的答案的“更新”部分吗?我读过。我希望能有一些不需要引入更多图书馆的东西。但总体来说,这可能比我开始考虑的黑客更干净。感谢BaukeOmniFaces不仅仅是一个库:)其中有很多东西可以极大地帮助减少/简化JSF代码。实际上OmniFaces主页上说它是一个“实用程序库”。我将查看OmniFaces,但将附加依赖项保持在最低限度是一个优先事项。我可以选择保留FacesConverter声明,但通过CDIBeanManager使用显式查找来替换非功能性注入注释。如果这个问题能在JSF中解决就好了。已经有一段时间了。。。
@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;
    }
}