2017-07-10 5 views
2

Je courais une ancienne version de omnifaces - 1.8.3, maintenant je mis à jour à la dernière 2.6.3 et je reçois une exception assez bizarre quand j'essaie de me connecter . Le problème est que je ne sais vraiment pas comment déboguer correctement un JSF .xthmljar omnifaces, maintenant il dit que mes convertisseurs sont ambigus

Exception Je reçois:

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) 
.... 

J'ai indiqué < p: (composant)> < f: convertisseur> </p: (composant)> dans de nombreux fichiers et je ne sais pas si je devrais les changer en < p: (component) converter = "" /> maintenant ou si je devrais ajouter plus (et où?) pour la nouvelle version.

Je ne sais pas quel est le problème avec la nouvelle version, quelqu'un peut-il aider?

Merci d'avance!

+0

Avez-vous le même problème avec des composants JSF simples? Et ce n'est pas un problème xhtml mais un bean. Avez-vous par hasard injecter des interfaces spmewhere? – Kukeltje

+0

Mettez '@ Specializes' sur les sous-classes de convertisseur qui étend un autre convertisseur et réessayez (voir aussi http://showcase.omnifaces.org/cdi/FacesConverter). Si cela échoue encore, parlez plus sur les versions serveur/JSF/CDI utilisées. – BalusC

+0

Je l'ai réparé et posté la solution ci-dessous, merci pour l'aide! –

Répondre

0

On dirait un Convertisseur prolongeant org.omnifaces.converter.SelectItemsConverter donne cette exception, implémentant javax.faces.convert.Converter l'a corrigé pour moi. Ne sait pas pourquoi est-il si ...

4

Cela se produira si vous avez un @FacesConverter qui étend un @FacesConverter existant au lieu d'implémenter directement l'interface Converter.

Par exemple,

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

De cette façon, lorsque vous demandez CDI pour une instance de IdentifiableConvertor, CDI ne sait pas exactement de quelle vous voulez dire. Il pourrait être aussi bon IdentityHashCodeConverter ou LoginConverter parce qu'ils sont tous deux assignables à un champ IdentifiableConvertor. C'est ambigu.

Ceci peut être résolu en mettant @Specializes sur les sous-classes.

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

De cette façon, CDI sait que IdentityHashCodeConverter ne doit être affecté à un champ IdentityHashCodeConverter et le LoginConverter ne doit être affecté à un champ LoginConverter. Lorsque vous demandez maintenant IdentifiableConvertor, CDI sait qu'il ne peut pas être le IdentityHashCodeConverter ou IdentityHashCodeConverter et donc que le IdentifiableConvertor reste disponible, sans ambiguïté.

Vous pouvez également déposer la superclasse et mettre en œuvre l'interface Converter nue directement. Mais ce n'est pas DRY.

+0

Échec de définition CDI: WELD-000047: Le bean spécialisé doit étendre un autre bean: Bean géré [classe kamelon.ui.convertors.IdentifiableConvertor] avec des qualificateurs [@Any @Default] J'étend org.omnifaces.converter.SelectItemsConverter; –

+0

Comment ressemble votre beans.xml? Avec 'bean-discovery-mode =" tout "'? – BalusC

+0

Je ne peux pas l'avoir depuis que je cours CDI 1.0 –