JPA Inject EntityManager im JSF-ManagedBean

freakyy

Mitglied
Hallo!

Ich versuche in einem ManagedBean einen EntityManager über die Annotation @PersistenceContext injizieren zu lassen.
Leider funktioniert das jedoch nicht wie gewünscht und bekomme eine NullPointerExcpetion, sobald ich die Methode load() aufrufe.

Java:
@ManagedBean(name="jpamgmt", eager=true)
@ApplicationScoped
public class JPAManagement extends Management {

    @PersistenceContext(unitName="boox")
    private EntityManager em;
   
    public JPAManagement() {
        System.out.println("JPAManagement gestartet.");
        try{
            load();
            System.out.println("load() durchgeführt.");
        }catch(Exception e){
            System.out.println(e.getMessage());
        }
    }
   
    @Override
    public void load() {
        TypedQuery<Book> tq = this.em.createNamedQuery("getAll", Book.class);
        this.books = tq.getResultList();
    }

    ...
Die Superklasse kann hier ignoriert werden (enthält nur abstrakte Methoden).
Code:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="boox" transaction-type="JTA">
        <jta-data-source>java:jboss/datasources/boox</jta-data-source>
        <class>entities.Book</class>
    </persistence-unit>
</persistence>
Ich verwende einen lokalen Wildfly Server, wo ich die Datasource bereits erstellt habe.
Hier noch mein Stacktrace:
Java:
00:21:31,843 SEVERE [javax.enterprise.resource.webcontainer.jsf.config] (ServerService Thread Pool -- 60) Critical error during deployment: : com.sun.faces.mgbean.ManagedBeanCreationException: Klasse persistence.JPAManagement kann nicht instanziiert werden.
    at com.sun.faces.mgbean.BeanBuilder.newBeanInstance(BeanBuilder.java:191)
    at com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:100)
    at com.sun.faces.mgbean.BeanManager.createAndPush(BeanManager.java:409)
    at com.sun.faces.mgbean.BeanManager.create(BeanManager.java:269)
    at com.sun.faces.mgbean.BeanManager.create(BeanManager.java:256)
    at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:259)
    at io.undertow.servlet.core.ApplicationListeners.contextInitialized(ApplicationListeners.java:173)
    at io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:195)
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:100)
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:82)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
    at org.jboss.threads.JBossThread.run(JBossThread.java:320)
Caused by: java.lang.NullPointerException
    at persistence.JPAManagement.<init>(JPAManagement.java:31)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
    at java.lang.Class.newInstance(Class.java:442)
    at com.sun.faces.mgbean.BeanBuilder.newBeanInstance(BeanBuilder.java:186)
    ... 15 more

00:21:31,846 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 60) MSC000001: Failed to start service jboss.undertow.deployment.default-server.default-host./boox: org.jboss.msc.service.StartException in service jboss.undertow.deployment.default-server.default-host./boox: java.lang.RuntimeException: java.lang.RuntimeException: com.sun.faces.mgbean.ManagedBeanCreationException: Klasse persistence.JPAManagement kann nicht instanziiert werden.
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:85)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
    at org.jboss.threads.JBossThread.run(JBossThread.java:320)
Caused by: java.lang.RuntimeException: java.lang.RuntimeException: com.sun.faces.mgbean.ManagedBeanCreationException: Klasse persistence.JPAManagement kann nicht instanziiert werden.
    at io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:224)
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:100)
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:82)
    ... 6 more
Caused by: java.lang.RuntimeException: com.sun.faces.mgbean.ManagedBeanCreationException: Klasse persistence.JPAManagement kann nicht instanziiert werden.
    at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:292)
    at io.undertow.servlet.core.ApplicationListeners.contextInitialized(ApplicationListeners.java:173)
    at io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:195)
    ... 8 more
Caused by: com.sun.faces.mgbean.ManagedBeanCreationException: Klasse persistence.JPAManagement kann nicht instanziiert werden.
    at com.sun.faces.mgbean.BeanBuilder.newBeanInstance(BeanBuilder.java:191)
    at com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:100)
    at com.sun.faces.mgbean.BeanManager.createAndPush(BeanManager.java:409)
    at com.sun.faces.mgbean.BeanManager.create(BeanManager.java:269)
    at com.sun.faces.mgbean.BeanManager.create(BeanManager.java:256)
    at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:259)
    ... 10 more
Caused by: java.lang.NullPointerException
    at persistence.JPAManagement.<init>(JPAManagement.java:31)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
    at java.lang.Class.newInstance(Class.java:442)
    at com.sun.faces.mgbean.BeanBuilder.newBeanInstance(BeanBuilder.java:186)
    ... 15 more

00:21:31,852 ERROR [org.jboss.as.controller.management-operation] (Controller Boot Thread) WFLYCTL0013: Operation ("deploy") failed - address: ([("deployment" => "boox.war")]) - failure description: {"WFLYCTL0080: Failed services" => {"jboss.undertow.deployment.default-server.default-host./boox" => "org.jboss.msc.service.StartException in service jboss.undertow.deployment.default-server.default-host./boox: java.lang.RuntimeException: java.lang.RuntimeException: com.sun.faces.mgbean.ManagedBeanCreationException: Klasse persistence.JPAManagement kann nicht instanziiert werden.
    Caused by: java.lang.RuntimeException: java.lang.RuntimeException: com.sun.faces.mgbean.ManagedBeanCreationException: Klasse persistence.JPAManagement kann nicht instanziiert werden.
    Caused by: java.lang.RuntimeException: com.sun.faces.mgbean.ManagedBeanCreationException: Klasse persistence.JPAManagement kann nicht instanziiert werden.
    Caused by: com.sun.faces.mgbean.ManagedBeanCreationException: Klasse persistence.JPAManagement kann nicht instanziiert werden.
    Caused by: java.lang.NullPointerException"}}
00:21:31,902 INFO  [org.jboss.as.server] (Controller Boot Thread) WFLYSRV0010: Deployed "MySQL-Connector" (runtime-name : "mysql-connector-java-5.1.37-bin.jar")
00:21:31,903 INFO  [org.jboss.as.server] (ServerService Thread Pool -- 34) WFLYSRV0010: Deployed "boox.war" (runtime-name : "boox.war")
00:21:31,905 INFO  [org.jboss.as.controller] (Controller Boot Thread) WFLYCTL0183: Service status report
WFLYCTL0186:   Services which failed to start:      service jboss.undertow.deployment.default-server.default-host./boox: org.jboss.msc.service.StartException in service jboss.undertow.deployment.default-server.default-host./boox: java.lang.RuntimeException: java.lang.RuntimeException: com.sun.faces.mgbean.ManagedBeanCreationException: Klasse persistence.JPAManagement kann nicht instanziiert werden.

00:21:32,055 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0060: Http management interface listening on http://127.0.0.1:9990/management
00:21:32,056 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0051: Admin console listening on http://127.0.0.1:9990
00:21:32,056 ERROR [org.jboss.as] (Controller Boot Thread) WFLYSRV0026: WildFly Full 9.0.2.Final (WildFly Core 1.0.2.Final) started (with errors) in 8015ms - Started 358 of 547 services (2 services failed or missing dependencies, 229 services are lazy, passive or on-demand)
00:21:32,120 INFO  [org.jboss.as.jpa] (ServerService Thread Pool -- 12) WFLYJPA0011: Stopping Persistence Unit (phase 2 of 2) Service 'boox.war#boox'
00:21:32,123 INFO  [org.jboss.weld.deployer] (MSC service thread 1-6) WFLYWELD0010: Stopping weld service for deployment boox.war
00:21:32,124 INFO  [org.jboss.as.jpa] (ServerService Thread Pool -- 12) WFLYJPA0011: Stopping Persistence Unit (phase 1 of 2) Service 'boox.war#boox'
00:21:32,352 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-3) WFLYSRV0028: Stopped deployment boox.war (runtime-name: boox.war) in 253ms
00:21:32,395 INFO  [org.jboss.as.server] (DeploymentScanner-threads - 1) WFLYSRV0009: Undeployed "boox.war" (runtime-name: "boox.war")
00:21:32,397 INFO  [org.jboss.as.controller] (DeploymentScanner-threads - 1) WFLYCTL0183: Service status report
WFLYCTL0184:    New missing/unsatisfied dependencies:
      service jboss.deployment.unit."boox.war".component."com.sun.faces.config.ConfigureListener".START (missing) dependents: [service jboss.deployment.unit."boox.war".deploymentCompleteService]
      service jboss.deployment.unit."boox.war".component."javax.faces.webapp.FacesServlet".START (missing) dependents: [service jboss.deployment.unit."boox.war".deploymentCompleteService]
      service jboss.deployment.unit."boox.war".component."javax.faces.webapp.FacetTag".START (missing) dependents: [service jboss.deployment.unit."boox.war".deploymentCompleteService]
      service jboss.deployment.unit."boox.war".component."javax.servlet.jsp.jstl.tlv.PermittedTaglibsTLV".START (missing) dependents: [service jboss.deployment.unit."boox.war".deploymentCompleteService]
      service jboss.deployment.unit."boox.war".component."javax.servlet.jsp.jstl.tlv.ScriptFreeTLV".START (missing) dependents: [service jboss.deployment.unit."boox.war".deploymentCompleteService]
      service jboss.deployment.unit."boox.war".component."managed-bean.beans.AddBookBean".START (missing) dependents: [service jboss.deployment.unit."boox.war".deploymentCompleteService]
      service jboss.deployment.unit."boox.war".component."managed-bean.beans.BookBean".START (missing) dependents: [service jboss.deployment.unit."boox.war".deploymentCompleteService]
      service jboss.deployment.unit."boox.war".component."managed-bean.persistence.JPAManagement".START (missing) dependents: [service jboss.deployment.unit."boox.war".deploymentCompleteService]
      service jboss.deployment.unit."boox.war".component."org.jboss.weld.servlet.WeldInitialListener".START (missing) dependents: [service jboss.deployment.unit."boox.war".deploymentCompleteService]
      service jboss.deployment.unit."boox.war".component."org.jboss.weld.servlet.WeldTerminalListener".START (missing) dependents: [service jboss.deployment.unit."boox.war".deploymentCompleteService]
      service jboss.persistenceunit."boox.war#boox" (missing) dependents: [service jboss.deployment.unit."boox.war".deploymentCompleteService]
      service jboss.undertow.deployment.default-server.default-host./boox (missing) dependents: [service jboss.deployment.unit."boox.war".deploymentCompleteService]
WFLYCTL0186:   Services which failed to start:      service jboss.undertow.deployment.default-server.default-host./boox

00:21:36,941 INFO  [org.jboss.as.server.deployment.scanner] (DeploymentScanner-threads - 1) WFLYDS0004: Found boox.war in deployment directory. To trigger deployment create a file called boox.war.dodeploy
Muss ich noch etwas machen, dass der EntityManager injiziert wird, oder sollte das reichen?
Wenn ja, hat irgendwer eine Idee wo das Problem liegt?

LG
 

stg

Top Contributor
Das Problem ist, dass erst über den NoArgs-Konstruktor eine Instanz erzeugt wird und dann die per Field-Injection gesetzen Abhängigkeiten injiziert werden. Du rufst den EntityManager also schlicht zu früh auf. Er kann noch nicht "da sein", weil der Konstruktor noch nicht komplett durchlaufen wurde. Für das, was du vorhast, gibt es Callback-Methoden, wie z.B. @PostConstruct.
Ungeachtet dessen hat der EntityManager in der JSF Managed Bean (sofern du sie überhaupt noch verwenden willst) bei sauberer Schichtentrennung nichts verloren, sondern gehört ausschlielßlich ins Service-Layer.
 

Ähnliche Java Themen

Neue Themen


Oben