2013-12-13 2 views
0

Да, я знаю, что должен использовать Declarative Services или Blueprint. Однако я пытаюсь выяснить один простой пример, используя API нижнего уровня, чтобы получить представление OSGi.OSGi с JPA: Сервис не начат, хотя код выглядит нормально

Я просто хочу знать Что не так с кодом и почему я не могу получить услугу вообще? !!

Я использовал два подхода здесь: один с ServiceTracker, а другой с ServiceReference, я знаю, как это ненадежны, но может кто-то плз помочь мне получить этот пример кода работает. Было бы так благодарно за это!

Вот мой код:

У меня есть простой Accounts Entity класс:

package model.account; 

import javax.persistence.*; 

@Entity 
public class Account { 

@Id @GeneratedValue 
int id; 
double balance; 

public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

public double getBalance() { 
    return balance; 
} 

public void setBalance(double balance) { 
    this.balance = balance; 
} 

@Override 
public String toString() { 
    return "Account{" + "id=" + id + ", balance=" + balance + '}'; 
} 

} 

AccountClient как:

package client; 

public class AccountClient { 

public void run(EntityManagerFactory emf) { 
    EntityManager em = emf.createEntityManager(); 
    em.getTransaction().begin(); 

    Account a = new Account(); 
    a.setBalance(100.0); 
    em.persist(a); 

    em.getTransaction().commit(); 

    TypedQuery<Account> q = em.createQuery("SELECT a FROM Account a", Account.class); 
    List<Account> results = q.getResultList(); 
    System.out.println("\n*** Account Report ***"); 
    for (Account acct : results) { 
     System.out.println("Account: " + acct); 
    } 
    em.close(); 
} 
} 

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="Accounts" transaction-type="RESOURCE_LOCAL"> 
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
<class>model.account.Account</class> 
<exclude-unlisted-classes>true</exclude-unlisted-classes> 
    <properties> 
     <property name="eclipselink.target-database" value="Derby"/> 
     <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/> 
     <property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/accountDB;create=true"/> 
     <property name="javax.persistence.jdbc.user" value="app"/> 
     <property name="javax.persistence.jdbc.password" value="app"/> 

     <property name="eclipselink.logging.level" value="FINE"/> 
     <property name="eclipselink.logging.timestamp" value="false"/> 
     <property name="eclipselink.logging.thread" value="false"/> 
     <property name="eclipselink.logging.exceptions" value="true"/> 
     <property name="eclipselink.orm.throw.exceptions" value="true"/> 
     <property name="eclipselink.jdbc.read-connections.min" value="1"/> 
     <property name="eclipselink.jdbc.write-connections.min" value="1"/>       
     <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/> 
     <property name="eclipselink.weaving" value="true"/> 

    </properties> 

И, наконец, Активатор с ServiceReference как:

package client; 

public class Activator implements BundleActivator { 

BundleContext ctx; 
ServiceReference[] serviceReferences; 
EntityManagerFactory emf; 

public void start(BundleContext context) throws Exception { 
    ctx = context; 
    System.out.println("Gemini JPA Basic Sample started"); 

    try{ 
     serviceReferences = context.getServiceReferences(
         EntityManagerFactory.class.getName(), 
         "(osgi.unit.name=Accounts)"); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
    if(serviceReferences != null){ 
     emf = (EntityManagerFactory)context.getService(serviceReferences[0]); 
    } 
    if(emf != null){ 
     new AccountClient().run(emf); 
    } 
} 

public void stop(BundleContext context) throws Exception { 
    if(serviceReferences != null){ 
     context.ungetService(serviceReferences[0]); 
    } 
    System.out.println("Gemini JPA Basic Sample stopped"); 
} 
} 

ServiceTracker:

package client; 
public class Activator implements BundleActivator, ServiceTrackerCustomizer { 

BundleContext ctx; 
ServiceTracker emfTracker; 

public void start(BundleContext context) throws Exception { 
    ctx = context; 
    System.out.println("Gemini JPA Basic Sample started"); 

    /* We are in the same bundle as the persistence unit so the services should be 
    * available when we start up (if nothing bad happened) and the tracker is really 
    * just saving us the lookup, but this is the idea of how you would listen for a 
    * persistence unit coming from another bundle. 
    */ 
    emfTracker = new ServiceTracker(ctx, EntityManagerFactory.class.getName(), this); 
    emfTracker.open(); 
    System.out.println("Started finally!!"); 
} 

public void stop(BundleContext context) throws Exception { 
    emfTracker.close(); 
    System.out.println("Gemini JPA Basic Sample stopped"); 
} 

/*========================*/ 
/* ServiceTracker methods */ 
/*========================*/ 

public Object addingService(ServiceReference ref) { 
    System.out.println("reached in add"); 
    Bundle b = ref.getBundle(); 
    System.out.println("Got ref"); 
    Object service = b.getBundleContext().getService(ref); 
    System.out.println("service"); 
    String unitName = (String)ref.getProperty(EntityManagerFactoryBuilder.JPA_UNIT_NAME); 
    System.out.println("search"); 

    if (unitName.equals("Accounts")) { 
     new AccountClient().run((EntityManagerFactory)service); 
     System.out.println("Found and started"); 
    } 
    return service; 
} 
public void modifiedService(ServiceReference ref, Object service) {} 
public void removedService(ServiceReference ref, Object service) {}  
} 

ответ

1

ли ваш манифест содержит т он заголовок Meta-Persistence и все зависимости, как описано в JPA Documentation? Все ли пучки в комплекте?

Может быть, это помогает Installing and Starting Gemini JPA Applications

+0

Да, я сделал то же самое. Я попробовал другой подход, когда он создаст экземпляр объекта EntityManagerFactory и вызовет Persistence.createEntityManagerFactory («Учетные записи»); где он дает ошибку для «Нет единицы постоянства, найденной с именем Accounts». У вас есть какие-то входы для этого? – Amrit

+0

Persistence.createEntityManagerFactory («Учетные записи») выполняет сканирование классов и не будет работать в среде OSGi. – sebplorenz

+0

Gemini JPA использует шаблон расширения, чтобы найти файл persistence.xml. Поэтому расширитель JPA будет ожидать пакеты, содержащие в манифесте заголовок Meta-Persistence. Если он найдет один, он будет использовать этот контекст связки, чтобы найти файл persistence.xml в этом пакете. Файл persistence.xml затем считывается Gemini JPA, а объекты загружаются с использованием контекста константы bunlde. Затем сконфигурированный EntityManagerFactory добавляется как служба в контекст. Если это не работает, возможно, ваш пакет персистентности или расширитель JPA не запущен, Meta-Persistence отсутствует ... – sebplorenz

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