JSF Converter mit EJB Injection – JSF 2.3


Gerade für Konverter war es schmerzlich, dass ein Injizieren von EJBs und anderen CDI Beans nicht möglich war. Mit JSF 2.3 kam nun endlich das notwendige Feature (wie auch für Validator und Behavior).

https://javaserverfaces.github.io/whats-new-in-jsf23.html

beschreibt die neuen Möglichkeiten und auch dass das Attribut „managed = true“ gesetzt werden muss.

Verwendet man nun ausschließlich diese Informationen und versucht eine EJB in einen @FacesConverter zu injizieren, erhält man eine NPE, da das Injizieren nicht funktioniert. Folgende weiteren Bedingungen müssen erfüllt sein:

Es müssen JSF Bibliotheken größer gleich Version 2.3. verwendet werden. Prüft diese beim Starten des Servers in den Logs. Gegebenenfalls wurde die Mojarra Implementierung explizit in der web.xml gesetzt und muss angepasst werden.

Es muss ein beans.xml Datei existieren, in der

 
bean-discovery-mode="all" 

gesetzt ist (Achtung annotated ist hier nicht ausreichend).

 
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
                http://xmlns.jcp.org/xml/ns/javaee/beans_2_0.xsd"
   bean-discovery-mode="all" version="2.0">
</beans>

Die faces-config.xml muss die Version 2.3 vorweisen

 
<?xml version='1.0' encoding='UTF-8'?>
<faces-config version="2.3"
          xmlns="http://xmlns.jcp.org/xml/ns/javaee"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
                    http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_3.xsd">
    ....
</faces-config>

Der letzte und eventuell unerwartetste Schritt ist eine Konfiguration über eine Annotation, die einmal im Projekt existieren muss.

 
package de.schoeso.jsf;

import javax.faces.annotation.FacesConfig;
import javax.faces.annotation.FacesConfig.Version;

// Aktiviert CDI build-in Beans
@FacesConfig(
    version = Version.JSF_2_3
)
public class ConfigBean {

    /** Konstruktor */
    public ConfigBean() {
    }

}

Erst all diese Einstellungen führen zum Erfolgt. Als verwöhnter JEE Nutzer hätte man sich gewünscht, dass dies wie andere Funktionen von JEE einfacher zu verwenden ist … aber man soll nicht klagen. Eventuell tut sich da ja noch etwas.

Bis zum nächsten Mal

Arndt

Du hast Fragen oder Anmerkungen? Kontakt: arndt@schoenb.de