jsf cdi myfaces weblogic12c

jsf - ¿Se puede usar MyFaces+CDI en WebLogic 12c?



weblogic12c (3)

He intentado que esta configuración se ejecute durante un par de días pero todavía no tengo suerte. Aquí está la aplicación de prueba que he estado usando:

@Named @RequestScoped public class Test { private String test = "test"; public String getTest() { return test; } public void setTest(String test) { this.test = test; } }

Y en la página jsf:

<h:outputText value="#{test.test}"/>

Ejecutar esta muestra sin MyFaces funciona bien (hace "test" como debería), pero cuando despliego MyFaces en el archivo WAR y hago la configuración necesaria dentro de weblogic.xml CDI parece dejar de funcionar (o al menos, la integración entre JSF y CDI) y no se muestra nada en el html de salida. MyFaces en sí parece estar bien, sin embargo.

Mi configuración básica es la siguiente:

  • WebLogic Server 12c (12.1.1.0), los parches deben estar actualizados ya que acabo de descargar una versión de desarrollo ayer solo para estar seguro
  • MyFaces-2.1.10, desplegado en WEB-INF / libs
  • Beans.xml está en su lugar
  • org.apache.myfaces.webapp.StartupServletContextListener se ha registrado en web.xml
  • WebLogic está configurado para usar MyFaces usando weblogic.xml

Contenido de Weblogic.xml:

<prefer-application-packages> <package-name>javax.faces.*</package-name> <package-name>com.sun.faces.*</package-name> <package-name>com.bea.faces.*</package-name> </prefer-application-packages> <prefer-application-resources> <resource-name>javax.faces.*</resource-name> <resource-name>com.sun.faces.*</resource-name> <resource-name>com.bea.faces.*</resource-name> <resource-name>META-INF/services/javax.servlet.ServletContainerInitializer</resource-name> <resource-name>META-INF/services/com.sun.faces.spi.FacesConfigResourceProvider</resource-name> </prefer-application-resources>

Lo que he aprendido hasta ahora:

  • WL12c está equipado con Weld 1.1.3 ya que es la implementación de CDI.
  • Leí en alguna parte (no recuerdo dónde) que siempre que decida cambiar la implementación de JSF, usted es responsable de integrar JSF / CDI usted mismo. ¿Es esto cierto (seguro que no es así)?

Cosas que he intentado hasta ahora:

  • Agregue MyFaces CODI a la mezcla, con la esperanza de que de alguna manera pegue Weld y MyFaces, pero no fue así.
  • Reemplace Weld por OpenWebBeans como la implementación de CDI. Esto pareció funcionar al principio, pero dio todo tipo de ClassCastExceptions interesantes más adelante en algún paquete interno de reflexión solar. Esta es una solución que preferiría evitar de todos modos.
  • Dispare manualmente Weld usando varias opciones en web.xml y faces-config.xml. Esto parece hacer entrar a Weld en que inunda el registro con todo tipo de mensajes de error. Hasta cierto punto, estos pueden ser "corregidos" mediante la actualización de Weblogic a una versión más nueva de Weld, pero cada vez que lo hago tropiezo con el siguiente error. De nuevo, prefiero evitar esta ruta también.

¿De verdad es tan difícil usar MyFaces en WL12c mientras se conserva el soporte de CDI o simplemente me falta lo obvio? Gracias por cualquier ayuda.


Me temo que no hay forma de hacerlo. El código de pegamento de soldadura debe estar allí. Esas pequeñas y pequeñas capas de integración que forman parte de las bibliotecas desplegables de wls para jsf no están disponibles para myfaces ....


Hay bastantes cosas que no están claras en tu ejemplo. Por ejemplo, ¿de qué paquete es @RequestScoped? ¿Es javax.enterprise.context.RequestScoped (debería funcionar) o javax.faces.bean.RequestScoped (no funcionará)? Si está utilizando solo beans CDI (y no javax.faces.bean cosas) entonces la única forma en que el contenedor JSF y el contenedor CDI se integran entre sí es en realidad el lenguaje de expresiones unificadas javax.el.ELResolver. Y esto debe funcionar de la caja.

org.apache.myfaces.webapp.StartupServletContextListener no es realmente necesario imo. Todo lo que necesita es configurar el FacesServlet.

El punto problemático podría ser que JSF EG se viera obligado a usar el ServletContainerInitializer [1] para activar ciegamente el JSF impl, incluso si la aplicación no usa JSF en absoluto. Esto es difícil de manejar ya que la especificación servlet-3.0 solo define cómo activar automáticamente esas características, pero NO hay manera de desactivarlas nuevamente.

[1] http://docs.oracle.com/javaee/6/api/javax/servlet/ServletContainerInitializer.html


Solo me preguntaba, ¿has intentado habilitar el servlet de soldadura dentro de tu aplicación?

La razón por la que pregunté es por esta declaración:

Leí en alguna parte (no recuerdo dónde) que cada vez que decida cambiar la implementación de JSF, usted es responsable de integrar JSF / CDI usted mismo

Que es bastante preciso El contenedor es el que hace toda la estratificación combinada de JSF impl y CDI impl juntas. Si lo reemplaza con su propia impl JSF, está pasando por alto lo que el contenedor le da. Si todavía no lo has hecho, te recomiendo encarecidamente que intentes habilitar Weld Servlet en tu aplicación para ver si CDI arranca con la impl JSF personalizada.