2013-09-25 21 views
5

JBoss 7.1, OmniFaces 1.6, Eclipse Kepler, CDI 1.0Làm thế nào để sử dụng OmniFaces 1.6 trong hai WAR trong một EAR?

Tôi đã tìm thấy tình huống sau đây với Omnifaces 1.6 mới, khi tôi cập nhật từ OmniFaces 1.5 lên OmniFaces 1.6. Tôi cho rằng nó có liên quan đến các tính năng CDI thú vị mới của OmniFaces 1.6.

Tôi có hai dự án WAR dựa trên JSF trong một bản lưu trữ EAR, cả hai dự án đều có OmniFaces làm phụ thuộc và cả hai dự án đều sẽ được triển khai. Khi triển khai, OmniFaces 1.6 kết thúc trong /WEB-INF/lib của cả hai dự án WAR. Khi bắt đầu JBoss, IllegalArgumentException bị ném.

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) 

Nếu tôi xóa một dự án WAR, thì ngoại lệ sẽ biến mất và tôi có thể sử dụng dự án WAR khác trong EAR.

Có thể sử dụng OmniFaces 1.6 trong nhiều dự án và triển khai lên JBoss 7.1.1 trong một EAR không?

+2

Sự cố này đã được xác định và chúng tôi hiện đang làm việc với nó: https://code.google.com/p/omnifaces/issues/detail?id=251 Hôm nay hoặc ngày mai sẽ có phiên bản 1.6.1 với các bản sửa lỗi bắt buộc. – BalusC

+0

Cảm ơn bạn, tôi sẽ chờ đợi để sửa chữa! – Tony

+1

Tôi đã sửa nó. Vui lòng thử ảnh chụp nhanh 1.6.1: https://oss.sonatype.org/content/repositories/snapshots/org/omnifaces/omnifaces/1.6.1-SNAPSHOT/ Nếu nó hoạt động cho bạn, tôi sẽ đăng câu trả lời với giải thích. – BalusC

Trả lời

3

Lỗi này đã được sửa trong 1.6.1. Có khá nhiều câu chuyện đằng sau lỗi này, vì vậy tôi vừa viết một blog về điều đó: CDI behaved unexpectedly in EAR, so OmniFaces 1.6.1 released!

Tóm tắt: Ngữ cảnh CDI không rộng khắp WAR, nhưng rộng khắp. Đối với ngoại lệ cụ thể mà bạn phải đối mặt, đó là vì chỉ có một CDI ConverterExtension được nạp từ một WAR mà sau đó được áp dụng rộng EAR và do đó xử lý tất cả các lớp @FacesConverter từ cả hai WAR thay vì WAR. từ.

Lưu ý rằng đây không phải là vấn đề trong OmniFaces. Đây là một vấn đề trong cách CDI hoạt động trong EAR.


Cập nhật: theo vấn đề WELD-2143 vấn đề đặc biệt này cuối cùng đã được cố định trong hàn 2.3.5. Tôi đã thử nghiệm nó trong bản vá lỗi WildFly 10.0.0 và xác nhận rằng tất cả các tính năng của OmniFaces CDI phụ thuộc vào một số Extension, @ViewScoped, @Eager@Param hoạt động trở lại trong cả hai WAR trong một EAR. Vì vậy, nếu bạn đấu tranh với việc sử dụng các tính năng CDI OmniFaces nói trên trong một EAR với nhiều WAR, hãy đảm bảo bạn nâng cấp Weld lên ít nhất là phiên bản 2.3.5. Vấn đề vẫn còn mở trong OpenWebBeans.

+0

Cảm ơn bạn đã trả lời nhanh và sửa lỗi! Đáng tiếc là tôi chưa thể sử dụng 1.6.1. Xem http://stackoverflow.com/questions/19247876/required-fields-with-omnifaces-1-6-1 – Tony

Các vấn đề liên quan