2016-08-31 4 views
0

Ich habe eine einfache Implementierung von JPA 2.0 Anmerkungen, die nicht funktioniert. Dies läuft in Karaf 4.0.5 als Server. Im Folgenden sind die relevanten Auszüge aus persistence.xml, blueprint.xml und der Klasse aufgeführt. Die Ausnahme ist unten aufgeführt. Das Problem ist, dass EntityManager em immer Null ist. Ich habe erwartet, dass dies durch einen Blueprint injiziert wird.jpa 2.0 injiziert nicht EntityManager

Kann jemand darauf hinweisen, wo ich falsch gelaufen bin?

Klasse

import javax.persistence.PersistenceContext; 
import javax.transaction.Transactional; 

@Transactional 
public class LookupMfgService implements ILookupMfgService { 
    private static Logger logger = LoggerFactory.getLogger(LookupMfgService.class); 
    @PersistenceContext(unitName = "pu_motordb3") 
    private EntityManager em; 

    @Override 
    public List<String> getPreferredMfgNames() throws BusinessException { 
     List<String> list = new ArrayList<>(); 

     try { 
    // em is null here so NPE thrown 
      TypedQuery<String> q = em.createNamedQuery("listMfgPreferredNames", String.class); 
      list = q.getResultList(); 
     } catch (Throwable t) { 
      logger.error("Error selecting list of manufacturers", t); 
      throw JpaExceptionFactory.createGeneralError(t, this.getClass().getName()); 
     } 

     return list; 
    } 

    public void setEm(EntityManager entityManager) { 
     logger.debug(this.getClass().getName() + ".setEntityManager()"); 
     logger.debug("setEntityManager called with " + (entityManager == null ? "null" : entityManager.toString())); 
     this.em = entityManager; 
    } 
} 

DataSource.xml

<blueprint default-activation="eager" 
    xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0" 

    xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0 
      http://www.w3.org/2001/XMLSchema-instance http://www.w3.org/2001/XMLSchema-instance 
      http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0 http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0 "> 

    <bean id="dataSource" class="org.postgresql.ds.PGPoolingDataSource" destroy-method="close"> 
     <property name="serverName" value="XXX"/> 
     <property name="user" value="XXX"/> 
     <property name="password" value="XXX"/> 
     <property name="dataSourceName" value="pgConnectionPool"/> 
     <property name="initialConnections" value="5"/> 
     <property name="maxConnections" value="50" /> 
    </bean> 

    <service interface="javax.sql.DataSource" ref="dataSource"> 
    <service-properties> 
      <entry key="osgi.jndi.service.name" value="MotorDB"/> 
    </service-properties> 
    </service> 
</blueprint> 

Blueprint.xml

<blueprint default-activation="eager" 
    xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0" 
    xmlns:tx="http://aries.apache.org/xmlns/transactions/v2.0.0" xmlns:jpa="http://aries.apache.org/xmlns/jpa/v2.0.0" 
    xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0" 
    xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 https://osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd 
     http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0 http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0 
     http://aries.apache.org/xmlns/transactions/v2.0.0 http://aries.apache.org/xmlns/transactions/v2.0.0 
     http://aries.apache.org/xmlns/jpa/v2.0.0 http://aries.apache.org/xmlns/jpa/v2.0.0 
     http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0 http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0"> 

    <jpa:enable /> 
    <tx:enable /> 

    <service id="mfgLookupService" ref="mfgLookupEntityImpl" interface="ILookupMfgService"/> 

</blueprint> 

persistence.xml

<?xml version="1.0" encoding="UTF-8" ?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
    http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
    version="2.0"> 

    <persistence-unit name="pu_motordb3" transaction-type="JTA"> 
    <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> 
    <jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=MotorDB)</jta-data-source> 
     Classes listed here 
    </persistence-unit> 
</persistence> 

Karaf log

2016-09-01 09:45:48,689 | INFO | PersistenceBundleTracker | 90 - org.apache.aries.jpa.container - 2.3.0 | Found persistence unit reference3 in bundle entity with provider org.apache.openjpa.persistence.PersistenceProviderImpl. 
2016-09-01 09:45:48,695 | INFO | PersistenceBundleTracker | 90 - org.apache.aries.jpa.container - 2.3.0 | Found persistence unit pu_motordb3 in bundle entity with provider org.apache.openjpa.persistence.PersistenceProviderImpl. 
2016-09-01 09:45:48,695 | INFO | PersistenceBundleTracker | 90 - org.apache.aries.jpa.container - 2.3.0 | Persistence units added for bundle com.easa.server.entity event 128 

Exception

2016-08-31 18:42:49,286 | ERROR | nelWorkerThread0 | LookupMfgService     | Error selecting list of manufacturers 
java.lang.NullPointerException 
     at LookupMfgService.getPreferredMfgNames(LookupMfgService.java:93) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)[:1.8.0_91] 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)[:1.8.0_91] 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)[:1.8.0_91] 
     at java.lang.reflect.Method.invoke(Method.java:498)[:1.8.0_91] 
     at ch.ethz.iks.r_osgi.impl.ChannelEndpointImpl.handleMessage(ChannelEndpointImpl.java:1265)[69:ch.ethz.iks.r_osgi.remote:1.0.8.RC1_v20160823-2221] 
     at ch.ethz.iks.r_osgi.impl.ChannelEndpointImpl$2.run(ChannelEndpointImpl.java:315)[69:ch.ethz.iks.r_osgi.remote:1.0.8.RC1_v20160823-2221] 
     at ch.ethz.iks.r_osgi.impl.ChannelEndpointImpl$1.run(ChannelEndpointImpl.java:280)[69:ch.ethz.iks.r_osgi.remote:1.0.8.RC1_v20160823-2221] 

Antwort

0

Die Ursache war ein Problem mit Karaf 4.0.5 und Openjpa 2.4.1. Es wurde in Karaf 4.0.6

0

Ihre Datenquelle Konfiguration zu fehlen scheint. Sie verwenden osgi.jndi.service.name = MotorDB, das nirgendwo deklariert ist. Es gibt also keinen Dienst, der javax.sql.DataSource implementiert

Es muss etwas ähnlich dem folgenden Beispiel sein, das Oracle verwendet. Ändern Sie entsprechend für andere DBMS:

... 
<bean id="dataSourceBeanMfgLookupService" class="oracle.jdbc.pool.OracleDataSource"> 
    <property name="URL" value="???"/> 
    <property name="user" value="???"/> 
    <property name="password" value="???"/> 
</bean> 

<service id="dataSourceMfgLookupService" interface="javax.sql.DataSource" ref="dataSourceBeanMfgLookupService"> 
    <service-properties> 
    <entry key="osgi.jndi.service.name" value="MotorDB" /> 
    </service-properties> 
</service> 
... 

Außerdem können Sie eine Persistenz-Provider in Ihrer persistence.xml angeben. Wenn Sie Hibernate mit Oracle 10g verwendet würde es aussehen, irgendwie wie folgt aus:

<persistence xmlns="http://java.sun.com/xml/ns/persistence" ...> 

    <provider>org.hibernate.ejb.HibernatePersistence</provider> 

    ... 

    <properties> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" /> 
     <property name="hibernate.temp.use_jdbc_metadata_defaults" value="false" /> 
    ... 

Dann können Sie Ihre Datenquelle zu Ihren Diensten verlinken:

<bean id="mfgLookupEntityImpl" class="LookupMfgService"> 
    <jpa:context property="em" unitname="pu_motordb3" /> 
    <tx:transaction method="*" value="Required" /> 
</bean> 

Wenn dies noch nicht der EM einen Setter zu bieten hat injizieren:

AFAIK gab es/ist ein Fehler, der Eigenschaft Injektion funktionierte nur, wenn ein Setter verfügbar war.

+0

Oliver behoben ... Vielen Dank für Ihre Bewertung und Kommentare! Ich habe eine separate blueprint.xml, die die Datenquelle und JNDI-Referenz erstellt. Ich habe es oben eingefügt. Ich habe den Provider hinzugefügt und den Setter geändert/hinzugefügt. Erhalten Sie immer noch einen Nullzeiger, wenn Sie versuchen, den EntityManager zu referenzieren. Die Anmerkung sollte die Injektion behandeln, anstatt sie direkt in die Datei blueprint.xml hinzuzufügen –

Verwandte Themen