2013-09-25 15 views
5

JBoss 7.1, OmniFaces 1.6, Eclipse Keplero, CDI 1.0Come utilizzare OmniFaces 1.6 in due WAR in un EAR?

ho trovato la seguente situazione con il nuovo Omnifaces 1.6, quando ho aggiornato da 1,5 a OmniFaces OmniFaces 1.6. Suppongo che abbia qualcosa a che fare con le nuove interessanti funzionalità CDI di OmniFaces 1.6.

Ho due progetti WAR basati su JSF in un archivio EAR, entrambi i progetti hanno OmniFaces come dipendenza ed entrambi verranno distribuiti. Nella distribuzione, OmniFaces 1.6 finisce nello /WEB-INF/lib di entrambi i progetti WAR. All'inizio di JBoss è stato lanciato lo IllegalArgumentException.

java.lang.IllegalArgumentException: Registering converter 'class org.omnifaces.converter.ListConverter' failed, duplicates converter ID 'omnifaces.ListConverter' of other converter 'class org.omnifaces.converter.ListConverter'. 
    at org.omnifaces.cdi.converter.ConverterExtension.processConverters(ConverterExtension.java:78) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.jboss.weld.util.reflection.SecureReflections$13.work(SecureReflections.java:264) 
    at org.jboss.weld.util.reflection.SecureReflectionAccess.run(SecureReflectionAccess.java:52) 
    at org.jboss.weld.util.reflection.SecureReflectionAccess.runAsInvocation(SecureReflectionAccess.java:137) 
    at org.jboss.weld.util.reflection.SecureReflections.invoke(SecureReflections.java:260) 
    at org.jboss.weld.introspector.jlr.WeldMethodImpl.invokeOnInstance(WeldMethodImpl.java:170) 
    at org.jboss.weld.introspector.ForwardingWeldMethod.invokeOnInstance(ForwardingWeldMethod.java:51) 
    at org.jboss.weld.injection.MethodInjectionPoint.invokeOnInstanceWithSpecialValue(MethodInjectionPoint.java:154) 
    at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:241) 
    at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:229) 
    at org.jboss.weld.event.ObserverMethodImpl.notify(ObserverMethodImpl.java:207) 
    at org.jboss.weld.manager.BeanManagerImpl.notifyObservers(BeanManagerImpl.java:569) 
    at org.jboss.weld.manager.BeanManagerImpl.fireEvent(BeanManagerImpl.java:559) 
    at org.jboss.weld.bootstrap.events.AbstractContainerEvent.fire(AbstractContainerEvent.java:60) 
    at org.jboss.weld.bootstrap.events.AbstractDefinitionContainerEvent.fire(AbstractDefinitionContainerEvent.java:38) 
    at org.jboss.weld.bootstrap.events.ProcessManagedBeanImpl.fire(ProcessManagedBeanImpl.java:30) 
    at org.jboss.weld.bootstrap.AbstractBeanDeployer.deploy(AbstractBeanDeployer.java:123) 
    at org.jboss.weld.bootstrap.BeanDeployment.deployBeans(BeanDeployment.java:204) 
    at org.jboss.weld.bootstrap.WeldBootstrap.deployBeans(WeldBootstrap.java:344) 
    at org.jboss.as.weld.WeldContainer.start(WeldContainer.java:82) 
    at org.jboss.as.weld.services.WeldService.start(WeldService.java:76) 
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) 
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) 
    at java.lang.Thread.run(Thread.java:662) 

Se rimuovo un progetto guerra, allora le scompare eccezione e posso usare l'altro progetto WAR in EAR.

È possibile utilizzare OmniFaces 1.6 in più come un progetto e distribuire su JBoss 7.1.1 in un EAR?

+2

Questo problema è già identificato e al momento ci stiamo lavorando: https://code.google.com/p/omnifaces/issues/detail?id=251 Oggi o domani ci sarà un 1.6.1 con il correzioni obbligatorie – BalusC

+0

Grazie, aspetterò una correzione! – Tony

+1

L'ho risolto. Per favore prova l'istantanea 1.6.1: https://oss.sonatype.org/content/repositories/snapshots/org/omnifaces/omnifaces/1.6.1-SNAPSHOT/ Se funziona per te, invierò una risposta con una spiegazione. – BalusC

risposta

3

Questo errore è stato corretto in 1.6.1. C'è una bella storia dietro questo bug, quindi ho appena scritto un blog su questo: CDI behaved unexpectedly in EAR, so OmniFaces 1.6.1 released!

Riepilogato: il contesto CDI non è a livello di WAR, ma EAR-wide. Per quanto riguarda la particolare eccezione che hai dovuto affrontare, è stato caricato un solo CDI ConverterExtension da un WAR che viene quindi applicato a EAR e quindi elaborando tutte le classi @FacesConverter da sia WAR che in WAR dove è stato caricato l'estensione CDI a partire dal.

Si noti che questo non è un problema in OmniFaces. Questo è un problema nel modo in cui il CDI funziona in EAR.


Aggiornamento: secondo problema WELD-2143 questo problema particolare è finalmente stato risolto in Weld 2.3.5. L'ho testato su una patch WildFly 10.0.0 e ho confermato che tutte le funzionalità di CDI OmniFaces che dipendono da, @ViewScoped, e @Param funzionano di nuovo in entrambe le WAR in un singolo EAR.

Quindi, se si fatica a utilizzare le funzionalità di CDI OmniFaces di cui sopra in un EAR con più WAR, assicurarsi di aggiornare Weld almeno alla versione 2.3.5. Il problema rimane aperto in OpenWebBeans.

+0

Grazie per la rapida risposta e correzione di errori! Purtroppo non posso ancora usare 1.6.1. Vedi http://stackoverflow.com/questions/19247876/required-fields-with-omnifaces-1-6-1 – Tony