所以我运行的是旧版本的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 :(组件)转换器="" />现在还是我应该为新版本添加更多(以及哪里?)
不知道新版本有什么问题,有人可以帮忙吗?
提前致谢!
答案 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并不知道您的确切含义。它可以很好IdentityHashCodeConverter
或LoginConverter
,因为它们都可以分配给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知道它不能是IdentityHashCodeConverter
或IdentityHashCodeConverter
,因此只有IdentifiableConvertor
仍然可用,而且没有歧义。
或者,您也可以删除超类并直接实现裸Converter
接口。但这不是DRY。
答案 1 :(得分:0)
看起来像转换器扩展org.omnifaces.converter.SelectItemsConverter给出了该异常,实现了javax.faces.convert.Converter为我修复了它。不知道为什么会这样......