jpa - Why is my EntityManager not properly injected? -
i tried build project manages employees using jpa , beans , jsf. started trying manipulated existing user manually created in database. (before tried read data database, worked well) tried in various ways, getting different errors, assume somethinbg wrong. server wildfly 8 , database postgresql.
15:09:43,410 error [io.undertow.request] (default task-14) ut005023: exception handling request /time/modifyuser.jsf: javax.servlet.servletexception: bei der ressourcen-einspeisung auf dem verwalteten bean employeemanagertool ist ein fehler aufgetreten. @ javax.faces.webapp.facesservlet.service(facesservlet.java:659) [jboss-jsf-api_2.2_spec-2.2.8.jar:2.2.8] @ io.undertow.servlet.handlers.servlethandler.handlerequest(servlethandler.java:85) [undertow-servlet-1.1.0.final.jar:1.1.0.final] //... caused by: javax.naming.namingexception: jbas011878: failed lookup env/tbp.wam.tools.employeemanagertool/entitymanager [root exception java.lang.nullpointerexception] //... caused by: java.lang.nullpointerexception @ org.jboss.as.jpa.container.extendedpersistencedeepinheritance.findextendedpersistencecontext(extendedpersistencedeepinheritance.java:49) [wildfly-jpa-8.2.0.final.jar:8.2.0.final] @ org.jboss.as.jpa.injectors.persistencecontextinjectionsource$persistencecontextjndiinjectable.getreference(persistencecontextinjectionsource.java:168) [wildfly-jpa-8.2.0.final.jar:8.2.0.final] @ org.jboss.as.naming.servicebasednamingstore.lookup(servicebasednamingstore.java:131) ... 93 more
so here bean:
@stateless(name = "employeemanagertool") public class employeemanagertool implements employeemanagertoollocal { @persistencecontext(type=persistencecontexttype.extended) private entitymanager entitymanager; public employeemanagertool() { } public void modifyemployee() { employee employee = entitymanager.find(employee.class, 1); employee.setfirstname("nnf"); employee.setlastname("nnl"); entitymanager.persist(employee); } //just trying alter first entry, there 1 id=1 // other crud methods }
my entity looks this:
@entity @table(name = "tbl_employee") public class employee implements serializable { private string firstname; private string lastname; private string username; private string password; @id @generatedvalue(strategy = generationtype.auto) private int id; @version private int version; public employee() {} //some getter , setter... }
my jsf file:
<!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"> <head> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" /> <title>ejb-in-ear</title> </head> <body> <h:form> <h:commandbutton value="save user" action="#{employeemanagertool.modifyemployee()}"/> </h:form> </body> </html>
my persistence.xml :
<?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="timebudget" transaction-type="jta"> <!-- using hibernate jpa provider --> <provider>org.hibernate.jpa.hibernatepersistenceprovider</provider> <!-- datenquelle ist postgres --> <jta-data-source>java:jboss/datasources/tbpds</jta-data-source> <properties> <!-- konfiguration für den postgresql-dialekt --> <property name="hibernate.dialect" value="org.hibernate.dialect.postgresqldialect" /> <!-- hibernate einstellungen --> <property name="hibernate.hbm2ddl.auto" value="update" /> <property name="hibernate.show_sql" value="false" /> <property name="hibernate.format_sql" value="false" /> <property name="hibernate.use_sql_comments" value="false" /> <property name="hibernate.archive.autodetection" value="class" /> </properties> </persistence-unit> </persistence>
pleaaase, me. i'm stuck @ whole weekend. don't i'm doing wrong...
standalone.xml:
<?xml version="1.0" ?> <server xmlns="urn:jboss:domain:2.2"> <extensions> <extension module="org.jboss.as.clustering.infinispan"/> <extension module="org.jboss.as.connector"/> <extension module="org.jboss.as.deployment-scanner"/> <extension module="org.jboss.as.ee"/> <extension module="org.jboss.as.ejb3"/> <extension module="org.jboss.as.jaxrs"/> <extension module="org.jboss.as.jdr"/> <extension module="org.jboss.as.jmx"/> <extension module="org.jboss.as.jpa"/> <extension module="org.jboss.as.jsf"/> <extension module="org.jboss.as.logging"/> <extension module="org.jboss.as.mail"/> <extension module="org.jboss.as.naming"/> <extension module="org.jboss.as.pojo"/> <extension module="org.jboss.as.remoting"/> <extension module="org.jboss.as.sar"/> <extension module="org.jboss.as.security"/> <extension module="org.jboss.as.transactions"/> <extension module="org.jboss.as.webservices"/> <extension module="org.jboss.as.weld"/> <extension module="org.wildfly.extension.batch"/> <extension module="org.wildfly.extension.io"/> <extension module="org.wildfly.extension.undertow"/> </extensions> <management> <security-realms> <security-realm name="managementrealm"> <authentication> <local default-user="$local" skip-group-loading="true"/> <properties path="mgmt-users.properties" relative-to="jboss.server.config.dir"/> </authentication> <authorization map-groups-to-roles="false"> <properties path="mgmt-groups.properties" relative-to="jboss.server.config.dir"/> </authorization> </security-realm> <security-realm name="applicationrealm"> <authentication> <local default-user="$local" allowed-users="*" skip-group-loading="true"/> <properties path="application-users.properties" relative-to="jboss.server.config.dir"/> </authentication> <authorization> <properties path="application-roles.properties" relative-to="jboss.server.config.dir"/> </authorization> </security-realm> </security-realms> <audit-log> <formatters> <json-formatter name="json-formatter"/> </formatters> <handlers> <file-handler name="file" formatter="json-formatter" path="audit-log.log" relative-to="jboss.server.data.dir"/> </handlers> <logger log-boot="true" log-read-only="false" enabled="false"> <handlers> <handler name="file"/> </handlers> </logger> </audit-log> <management-interfaces> <http-interface security-realm="managementrealm" http-upgrade-enabled="true"> <socket-binding http="management-http"/> </http-interface> </management-interfaces> <access-control provider="simple"> <role-mapping> <role name="superuser"> <include> <user name="$local"/> </include> </role> </role-mapping> </access-control> </management> <profile> <subsystem xmlns="urn:jboss:domain:logging:2.0"> <console-handler name="console"> <level name="info"/> <formatter> <named-formatter name="color-pattern"/> </formatter> </console-handler> <periodic-rotating-file-handler name="file" autoflush="true"> <formatter> <named-formatter name="pattern"/> </formatter> <file relative-to="jboss.server.log.dir" path="server.log"/> <suffix value=".yyyy-mm-dd"/> <append value="true"/> </periodic-rotating-file-handler> <logger category="com.arjuna"> <level name="warn"/> </logger> <logger category="org.apache.tomcat.util.modeler"> <level name="warn"/> </logger> <logger category="org.jboss.as.config"> <level name="debug"/> </logger> <logger category="sun.rmi"> <level name="warn"/> </logger> <logger category="jacorb"> <level name="warn"/> </logger> <logger category="jacorb.config"> <level name="error"/> </logger> <root-logger> <level name="info"/> <handlers> <handler name="console"/> <handler name="file"/> </handlers> </root-logger> <formatter name="pattern"> <pattern-formatter pattern="%d{yyyy-mm-dd hh:mm:ss,sss} %-5p [%c] (%t) %s%e%n"/> </formatter> <formatter name="color-pattern"> <pattern-formatter pattern="%k{level}%d{hh:mm:ss,sss} %-5p [%c] (%t) %s%e%n"/> </formatter> </subsystem> <subsystem xmlns="urn:jboss:domain:batch:1.0"> <job-repository> <in-memory/> </job-repository> <thread-pool> <max-threads count="10"/> <keepalive-time time="30" unit="seconds"/> </thread-pool> </subsystem> <subsystem xmlns="urn:jboss:domain:datasources:2.0"> <datasources> <datasource jndi-name="java:jboss/datasources/exampleds" pool-name="exampleds" enabled="true" use-java-context="true"> <connection-url>jdbc:h2:mem:test;db_close_delay=-1;db_close_on_exit=false</connection-url> <driver>h2</driver> <security> <user-name>sa</user-name> <password>sa</password> </security> </datasource> <datasource jta="true" jndi-name="java:jboss/datasources/tbpds" pool-name="tbpds" enabled="true" use-ccm="true"> <connection-url>jdbc:postgresql://localhost:5432/bank</connection-url> <driver-class>org.postgresql.driver</driver-class> <driver>postgresql-9.4-1201.jdbc4.jar</driver> <security> <user-name>bank</user-name> <password>bank</password> </security> <validation> <validate-on-match>false</validate-on-match> <background-validation>false</background-validation> </validation> <timeout> <set-tx-query-timeout>false</set-tx-query-timeout> <blocking-timeout-millis>0</blocking-timeout-millis> <idle-timeout-minutes>0</idle-timeout-minutes> <query-timeout>0</query-timeout> <use-try-lock>0</use-try-lock> <allocation-retry>0</allocation-retry> <allocation-retry-wait-millis>0</allocation-retry-wait-millis> </timeout> <statement> <share-prepared-statements>false</share-prepared-statements> </statement> </datasource> <drivers> <driver name="h2" module="com.h2database.h2"> <xa-datasource-class>org.h2.jdbcx.jdbcdatasource</xa-datasource-class> </driver> </drivers> </datasources> </subsystem> <subsystem xmlns="urn:jboss:domain:deployment-scanner:2.0"> <deployment-scanner path="deployments" relative-to="jboss.server.base.dir" scan-interval="5000"/> </subsystem> <subsystem xmlns="urn:jboss:domain:ee:2.0"> <spec-descriptor-property-replacement>false</spec-descriptor-property-replacement> <concurrent> <context-services> <context-service name="default" jndi-name="java:jboss/ee/concurrency/context/default" use-transaction-setup-provider="true"/> </context-services> <managed-thread-factories> <managed-thread-factory name="default" jndi-name="java:jboss/ee/concurrency/factory/default" context-service="default"/> </managed-thread-factories> <managed-executor-services> <managed-executor-service name="default" jndi-name="java:jboss/ee/concurrency/executor/default" context-service="default" hung-task-threshold="60000" core-threads="5" max-threads="25" keepalive-time="5000"/> </managed-executor-services> <managed-scheduled-executor-services> <managed-scheduled-executor-service name="default" jndi-name="java:jboss/ee/concurrency/scheduler/default" context-service="default" hung-task-threshold="60000" core-threads="2" keepalive-time="3000"/> </managed-scheduled-executor-services> </concurrent> <default-bindings context-service="java:jboss/ee/concurrency/context/default" datasource="java:jboss/datasources/exampleds" jms-connection-factory="java:jboss/defaultjmsconnectionfactory" managed-executor-service="java:jboss/ee/concurrency/executor/default" managed-scheduled-executor-service="java:jboss/ee/concurrency/scheduler/default" managed-thread-factory="java:jboss/ee/concurrency/factory/default"/> </subsystem> <subsystem xmlns="urn:jboss:domain:ejb3:2.0"> <session-bean> <stateful default-access-timeout="5000" cache-ref="simple" passivation-disabled-cache-ref="simple"/> <singleton default-access-timeout="5000"/> </session-bean> <pools> <bean-instance-pools> <strict-max-pool name="slsb-strict-max-pool" max-pool-size="20" instance-acquisition-timeout="5" instance-acquisition-timeout-unit="minutes"/> <strict-max-pool name="mdb-strict-max-pool" max-pool-size="20" instance-acquisition-timeout="5" instance-acquisition-timeout-unit="minutes"/> </bean-instance-pools> </pools> <caches> <cache name="simple"/> <cache name="distributable" passivation-store-ref="infinispan" aliases="passivating clustered"/> </caches> <passivation-stores> <passivation-store name="infinispan" cache-container="ejb" max-size="10000"/> </passivation-stores> <async thread-pool-name="default"/> <timer-service thread-pool-name="default" default-data-store="default-file-store"> <data-stores> <file-data-store name="default-file-store" path="timer-service-data" relative-to="jboss.server.data.dir"/> </data-stores> </timer-service> <remote connector-ref="http-remoting-connector" thread-pool-name="default"/> <thread-pools> <thread-pool name="default"> <max-threads count="10"/> <keepalive-time time="100" unit="milliseconds"/> </thread-pool> </thread-pools> <default-security-domain value="other"/> <default-missing-method-permissions-deny-access value="true"/> </subsystem> <subsystem xmlns="urn:jboss:domain:io:1.1"> <worker name="default"/> <buffer-pool name="default"/> </subsystem> <subsystem xmlns="urn:jboss:domain:infinispan:2.0"> <cache-container name="web" default-cache="passivation" module="org.wildfly.clustering.web.infinispan"> <local-cache name="passivation" batching="true"> <file-store passivation="true" purge="false"/> </local-cache> <local-cache name="persistent" batching="true"> <file-store passivation="false" purge="false"/> </local-cache> </cache-container> <cache-container name="ejb" default-cache="passivation" module="org.wildfly.clustering.ejb.infinispan" aliases="sfsb"> <local-cache name="passivation" batching="true"> <file-store passivation="true" purge="false"/> </local-cache> <local-cache name="persistent" batching="true"> <file-store passivation="false" purge="false"/> </local-cache> </cache-container> <cache-container name="hibernate" default-cache="local-query" module="org.hibernate"> <local-cache name="entity"> <transaction mode="non_xa"/> <eviction strategy="lru" max-entries="10000"/> <expiration max-idle="100000"/> </local-cache> <local-cache name="local-query"> <transaction mode="none"/> <eviction strategy="lru" max-entries="10000"/> <expiration max-idle="100000"/> </local-cache> <local-cache name="timestamps"> <transaction mode="none"/> <eviction strategy="none"/> </local-cache> </cache-container> </subsystem> <subsystem xmlns="urn:jboss:domain:jaxrs:1.0"/> <subsystem xmlns="urn:jboss:domain:jca:2.0"> <archive-validation enabled="true" fail-on-error="true" fail-on-warn="false"/> <bean-validation enabled="true"/> <default-workmanager> <short-running-threads> <core-threads count="50"/> <queue-length count="50"/> <max-threads count="50"/> <keepalive-time time="10" unit="seconds"/> </short-running-threads> <long-running-threads> <core-threads count="50"/> <queue-length count="50"/> <max-threads count="50"/> <keepalive-time time="10" unit="seconds"/> </long-running-threads> </default-workmanager> <cached-connection-manager/> </subsystem> <subsystem xmlns="urn:jboss:domain:jdr:1.0"/> <subsystem xmlns="urn:jboss:domain:jmx:1.3"> <expose-resolved-model/> <expose-expression-model/> <remoting-connector/> </subsystem> <subsystem xmlns="urn:jboss:domain:jpa:1.1"> <jpa default-datasource="" default-extended-persistence-inheritance="deep"/> </subsystem> <subsystem xmlns="urn:jboss:domain:jsf:1.0"/> <subsystem xmlns="urn:jboss:domain:mail:2.0"> <mail-session name="default" jndi-name="java:jboss/mail/default"> <smtp-server outbound-socket-binding-ref="mail-smtp"/> </mail-session> </subsystem> <subsystem xmlns="urn:jboss:domain:naming:2.0"> <remote-naming/> </subsystem> <subsystem xmlns="urn:jboss:domain:pojo:1.0"/> <subsystem xmlns="urn:jboss:domain:remoting:2.0"> <endpoint worker="default"/> <http-connector name="http-remoting-connector" connector-ref="default" security-realm="applicationrealm"/> </subsystem> <subsystem xmlns="urn:jboss:domain:resource-adapters:2.0"/> <subsystem xmlns="urn:jboss:domain:sar:1.0"/> <subsystem xmlns="urn:jboss:domain:security:1.2"> <security-domains> <security-domain name="other" cache-type="default"> <authentication> <login-module code="remoting" flag="optional"> <module-option name="password-stacking" value="usefirstpass"/> </login-module> <login-module code="realmdirect" flag="required"> <module-option name="password-stacking" value="usefirstpass"/> </login-module> </authentication> </security-domain> <security-domain name="jboss-web-policy" cache-type="default"> <authorization> <policy-module code="delegating" flag="required"/> </authorization> </security-domain> <security-domain name="jboss-ejb-policy" cache-type="default"> <authorization> <policy-module code="delegating" flag="required"/> </authorization> </security-domain> </security-domains> </subsystem> <subsystem xmlns="urn:jboss:domain:transactions:2.0"> <core-environment> <process-id> <uuid/> </process-id> </core-environment> <recovery-environment socket-binding="txn-recovery-environment" status-socket-binding="txn-status-manager"/> </subsystem> <subsystem xmlns="urn:jboss:domain:undertow:1.2"> <buffer-cache name="default"/> <server name="default-server"> <http-listener name="default" socket-binding="http"/> <host name="default-host" alias="localhost"> <location name="/" handler="welcome-content"/> <filter-ref name="server-header"/> <filter-ref name="x-powered-by-header"/> </host> </server> <servlet-container name="default"> <jsp-config/> <websockets/> </servlet-container> <handlers> <file name="welcome-content" path="${jboss.home.dir}/welcome-content"/> </handlers> <filters> <response-header name="server-header" header-name="server" header-value="wildfly/8"/> <response-header name="x-powered-by-header" header-name="x-powered-by" header-value="undertow/1"/> </filters> </subsystem> <subsystem xmlns="urn:jboss:domain:webservices:1.2"> <wsdl-host>${jboss.bind.address:127.0.0.1}</wsdl-host> <endpoint-config name="standard-endpoint-config"/> <endpoint-config name="recording-endpoint-config"> <pre-handler-chain name="recording-handlers" protocol-bindings="##soap11_http ##soap11_http_mtom ##soap12_http ##soap12_http_mtom"> <handler name="recordinghandler" class="org.jboss.ws.common.invocation.recordingserverhandler"/> </pre-handler-chain> </endpoint-config> <client-config name="standard-client-config"/> </subsystem> <subsystem xmlns="urn:jboss:domain:weld:2.0"/> </profile> <interfaces> <interface name="management"> <inet-address value="${jboss.bind.address.management:127.0.0.1}"/> </interface> <interface name="public"> <inet-address value="${jboss.bind.address:127.0.0.1}"/> </interface> <interface name="unsecure"> <inet-address value="${jboss.bind.address.unsecure:127.0.0.1}"/> </interface> </interfaces> <socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}"> <socket-binding name="management-http" interface="management" port="${jboss.management.http.port:9990}"/> <socket-binding name="management-https" interface="management" port="${jboss.management.https.port:9993}"/> <socket-binding name="ajp" port="${jboss.ajp.port:8009}"/> <socket-binding name="http" port="${jboss.http.port:8080}"/> <socket-binding name="https" port="${jboss.https.port:8443}"/> <socket-binding name="txn-recovery-environment" port="4712"/> <socket-binding name="txn-status-manager" port="4713"/> <outbound-socket-binding name="mail-smtp"> <remote-destination host="localhost" port="25"/> </outbound-socket-binding> </socket-binding-group> <deployments> <deployment name="postgresql" runtime-name="postgresql-9.4-1201.jdbc4.jar"> <content sha1="b46544ef0eaf0405504089dcc71f36e3f190ef09"/> </deployment> <deployment name="wildfly-ejb-in-ear-ear.ear" runtime-name="wildfly-ejb-in-ear-ear.ear"> <content sha1="eee0b026b1fac8c09a35bc0ef318a237d8d47c6e"/> </deployment> </deployments> </server>
i noticed using extended entity manager (@persistencecontext(type=persistencecontexttype.extended)
stateless session bean @stateless
, when specify injected entitymanager extended persistence context, should use @stateful
session bean, because extended entitymanagers still live beyond scope of jta transaction, have 2 solutions:
- change stateless stateful session bean: in case please note extended entity managers create persistence context when stateful session bean instance created lasts until bean removed.
- change extended entity manager transaction-scoped entity manager using
type=persistencecontexttype.transaction
: persistence context of transaction-scoped entity manager begins when transaction begins , lasts until end of transaction, persistence context of extended entity manager last entire length of conversation.
Comments
Post a Comment