2016-08-31 8 views
0

У меня есть простая реализация аннотаций JPA 2.0, которые не работают. Это работает в karaf 4.0.5 как сервер. Ниже перечислены соответствующие выдержки из persistence.xml, blueprint.xml и класса. Исключение указано внизу.jpa 2.0 не вводит EntityManager

Проблема в том, что EntityManager em всегда имеет значение null. Я ожидал, что это будет введено планом.

Может ли кто-нибудь указать, где я ошибся?

Класс

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 войти

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 

конфигурации Исключение

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] 

ответ

0

Причина была связана с проблемой karaf 4.0.5 и openjpa 2.4.1. Он был решен в karaf 4.0.6

0

Ваш источник данных, как представляется, отсутствует. Вы используете osgi.jndi.service.name = MotorDB, который нигде не объявлен. Таким образом, нет службы, реализующей javax.sql.DataSource

Должно быть что-то похожее на следующий пример, который использует Oracle. Изменение соответственно для других СУБД:

... 
<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> 
... 

Кроме того, вы, возможно, придется указать сохраняемости-провайдера в вашем persistence.xml. Если вы использовали в спящий режим с Oracle 10g, это будет выглядеть как-то так:

<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" /> 
    ... 

Затем вы можете связать свой источник данных к вашим услугам:

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

Если это еще не впрыскивать ЕМ обеспечивают сеттер:

public void setEm(EntityManager entityManager) { 
    this.em = entityManager; 
} 

AFAIK был/был ошибкой, что инъекция свойств работала только в том случае, если сеттер был доступен.

+0

Oliver ... благодарит за ваш комментарий и комментарий! У меня есть отдельный файл blueprint.xml, который создает источник данных и ссылку jndi. Я включил его выше. Я добавил поставщика и изменил/добавил установщик. Все еще получайте нулевой указатель при попытке ссылаться на EntityManager. Аннотации должны обрабатывать инъекцию вместо добавления непосредственно в blueprint.xml –

Смежные вопросы