更新了omnifaces jar,现在它说我的转换器含糊不清

时间:2017-07-10 13:41:56

标签: jsf converter cdi omnifaces

所以我运行的是旧版本的omnifaces - 1.8.3,现在我更新到最新的2.6.3,当我尝试登录时,我得到了一些非常奇怪的异常。问题是我真的不知道如何正确调试.xthml jsf

我得到的例外:

2017-07-10T16:32:46.631+0300|Warning: StandardWrapperValve[Faces Servlet]: Servlet.service() for servlet Faces Servlet threw exception
org.jboss.weld.exceptions.AmbiguousResolutionException: WELD-001318: Cannot resolve an ambiguous dependency between: 
  - Managed Bean [class kamelon.ui.convertors.LoginConverter] with qualifiers [@Any @Default],
  - Managed Bean [class kamelon.ui.convertors.IdentityHashCodeConverter] with qualifiers [@Any @Default],
  - Managed Bean [class kamelon.ui.convertors.IdentifiableConvertor] with qualifiers [@Any @Default]
    at org.jboss.weld.manager.BeanManagerImpl.resolve(BeanManagerImpl.java:1235)
    at org.jboss.weld.util.ForwardingBeanManager.resolve(ForwardingBeanManager.java:91)
    at org.jboss.weld.bean.builtin.BeanManagerProxy.resolve(BeanManagerProxy.java:115)
    at org.omnifaces.util.BeansLocal.resolve(BeansLocal.java:77)
    at org.omnifaces.cdi.converter.ConverterManager.createConverter(ConverterManager.java:122)
    at org.omnifaces.cdi.converter.ConverterManager$Proxy$_$$_WeldClientProxy.createConverter(Unknown Source)
    at org.omnifaces.application.OmniApplication.createConverter(OmniApplication.java:82)
    at com.sun.faces.facelets.tag.jsf.ValueHolderRule$LiteralConverterMetadata.applyMetadata(ValueHolderRule.java:85)
    at com.sun.faces.facelets.tag.MetadataImpl.applyMetadata(MetadataImpl.java:81)
    at javax.faces.view.facelets.MetaTagHandler.setAttributes(MetaTagHandler.java:129)
    at javax.faces.view.facelets.DelegatingMetaTagHandler.setAttributes(DelegatingMetaTagHandler.java:102)
    at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.doNewComponentActions(ComponentTagHandlerDelegateImpl.java:491)
....

我指定了<号码:(组分)GT;< F:转换器>< / P:(组分)GT;在许多文件中,我不知道是否应该将它们切换为< p :(组件)转换器="" />现在还是我应该为新版本添加更多(以及哪里?)

不知道新版本有什么问题,有人可以帮忙吗?

提前致谢!

2 个答案:

答案 0 :(得分:4)

如果您使用@FacesConverter扩展现有@FacesConverter而不是直接实施Converter界面,则会发生这种情况。

例如,

@FacesConverter("identifiableConverter")
public class IdentifiableConvertor implements Converter {}
@FacesConverter("identityHashCodeConverter")
public class IdentityHashCodeConverter extends IdentifiableConvertor {}
@FacesConverter("loginConverter")
public class LoginConverter extends IdentityHashCodeConverter {}

这样,当您向CDI询问IdentifiableConvertor的实例时,CDI并不知道您的确切含义。它可以很好IdentityHashCodeConverterLoginConverter,因为它们都可以分配给IdentifiableConvertor字段。这是不明确的。

这可以通过将@Specializes放在子类上来解决。

@FacesConverter("identifiableConverter")
public class IdentifiableConvertor implements Converter {}
@FacesConverter("identityHashCodeConverter")
@Specializes
public class IdentityHashCodeConverter extends IdentifiableConvertor {}
@FacesConverter("loginConverter")
@Specializes
public class LoginConverter extends IdentityHashCodeConverter {}

这样,CDI知道IdentityHashCodeConverter只应分配给IdentityHashCodeConverter字段,而LoginConverter只应分配给LoginConverter字段。当您现在要求IdentifiableConvertor时,CDI知道它不能是IdentityHashCodeConverterIdentityHashCodeConverter,因此只有IdentifiableConvertor仍然可用,而且没有歧义。

或者,您也可以删除超类并直接实现裸Converter接口。但这不是DRY

答案 1 :(得分:0)

看起来像转换器扩展org.omnifaces.converter.SelectItemsConverter给出了该异常,实现了javax.faces.convert.Converter为我修复了它。不知道为什么会这样......