2016-12-07 32 views
0

免責聲明應用多個EJB:我是相當新的EJB的整個概念EJB無法解析引用,因爲有在同一個界面

我試圖做一個簡單的企業應用程序,它利用了EJB的依賴注入機制。我嘗試注入的對象是不同的(非泛型的)類,它們都實現相同的(通用)接口,並且也暴露爲該接口的類型爲其包含的類。問題是EJB不知道用什麼類來實例化它們包含的類中的所有對象。我將如何去解決這個問題?

(壞代碼格式化道歉)

,我試圖注入類:

@Stateless 
public class HumidityRepository implements ITimeStampedDataRepository<Humidity>, Serializable { 

@PersistenceContext(unitName = "WeatherPU") 
private EntityManager em; 

@Override 
public List<Humidity> getAll() { 
    Query q = em.createQuery("allHumidity"); 
    System.out.println(q.getResultList()); 
    List<Humidity> result = q.getResultList(); 
    return result; 
} 

@Override 
public List<Humidity> getAllOnDate(LocalDate date) { 
    Query q = em.createQuery("onDateHumidity") 
      .setParameter("date", date); 
    System.out.println(q.getResultList()); 
    List<Humidity> result = q.getResultList(); 
    System.out.println(result); 
    return result; 
} 

@Override 
public List<Humidity> getAllAfter(LocalDate date, LocalTime time) { 
    Query q = em.createQuery("afterHumidity") 
      .setParameter("date", date) 
      .setParameter("time", time); 
    List<Humidity> result = q.getResultList(); 
    return result; 
} 

@Override 
public void remove(LocalDate date, LocalTime time) { 
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
} 

@Override 
public void store(Humidity data) { 
    em.persist(data); 
} 

} 

和:

@Stateless 
public class TemperatureRepository implements ITimeStampedDataRepository<Temperature>, Serializable { 

@PersistenceContext(unitName = "WeatherPU") 
private EntityManager em; 

@Override 
public List<Temperature> getAll() { 
    Query q = em.createQuery("allTemperature"); 
    System.out.println(q.getResultList()); 
    List<Temperature> result = q.getResultList(); 
    return result; 
} 

@Override 
public List<Temperature> getAllOnDate(LocalDate date) { 
    Query q = em.createQuery("onDateTemperature") 
      .setParameter("date", date); 
    System.out.println(q.getResultList()); 
    List<Temperature> result = q.getResultList(); 
    System.out.println(result); 
    return result; 
} 

@Override 
public List<Temperature> getAllAfter(LocalDate date, LocalTime time) { 
    Query q = em.createQuery("afterTemperature") 
      .setParameter("date", date) 
      .setParameter("time", time); 
    List<Temperature> result = q.getResultList(); 
    return result; 
} 

@Override 
public void remove(LocalDate date, LocalTime time) { 
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
} 

@Override 
public void store(Temperature data) { 
    em.persist(data); 
} 
} 

他們共同的接口:

public interface ITimeStampedDataRepository<T extends TimeStampedData> { 

    public List<T> getAll(); 

    public List<T> getAllOnDate(LocalDate date); 

    public List<T> getAllAfter(LocalDate date, LocalTime time); 

    public void remove(LocalDate date, LocalTime time); 

    public void store(T data); 

} 

Finall Y,它們所包含的類是:

@Dependent 
public class Service implements IService { 

    @EJB 
    private ITimeStampedDataRepository<Humidity> humidityRepository; 
    @EJB 
    private ITimeStampedDataRepository<Temperature> temperatureRepository; 

    ... 

} 
+0

模具,如果你使用的具體類工作? '@EJB private HumidityRepository humidityRepository; @EJB private TemperatureRepository temperatureRepository;' –

回答

1

你有兩個選擇:

確定公司運作的一個名稱,以使您的EJB:

@Stateless(name="BeanNameOne") 
public class TemperatureRepository implements..... 

@Stateless(name="BeanNameTwo") 
public class HumidityRepository implements..... 

,並告訴客戶端注入該EJB。

@EJB(beanName="BeanNameOne") 
private ITimeStampedDataRepository<Temperature> temperatureRepository; 
@EJB(beanName="BeanNameTwo") 
private ITimeStampedDataRepository<Humidity> humidityRepository; 

2.refer到不合格的名稱

@EJB(beanName="TemperatureRepository ") 
private ITimeStampedDataRepository<Temperature> temperatureRepository; 
@EJB(beanName="HumidityRepository") 
private ITimeStampedDataRepository<Humidity> humidityRepository; 
+0

感謝您提供簡短明確的答案,Leonardo。命名我的EJB,然後通過引用它們的名字來注入它們確實解決了原來的問題。然而,當我嘗試讓兩個存儲庫類擴展一個子類以擺脫大量重複代碼時,我遇到了另一個問題。 EJB容器再次無法解析用於注入的類,但是我通過向存儲庫類添加@Remote註釋來解決這個問題。 – Exevan

+0

上一個評論的更新 我確實需要在glassfish-ejb-jar.xml中添加以下行來禁用glassfish JNDI名稱以使所有內容正常工作: true Exevan

相關問題