EJB 无法解析引用,因为应用程序中有多个具有相同接口的 ejb
EJB Cannot resolve reference because there are multiple ejbs in the application with the same interface
免责声明:我对 EJB 的整个概念相当陌生
我正在尝试制作一个使用 EJB 依赖注入机制的简单企业应用程序。我试图注入的对象是不同的(非通用的)class,它们都实现了相同的(通用的)接口,并且也作为该接口的类型暴露给它们包含的 class。问题是 EJB 不知道使用什么 class 来实例化包含 class 的所述对象。我将如何解决这个问题?
(对错误的代码格式表示歉意)
我要注入的 classes 是:
@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);
}
最后,他们包含的class是:
@Dependent
public class Service implements IService {
@EJB
private ITimeStampedDataRepository<Humidity> humidityRepository;
@EJB
private ITimeStampedDataRepository<Temperature> temperatureRepository;
...
}
您有两个选择:
1.Give 您的 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;
免责声明:我对 EJB 的整个概念相当陌生
我正在尝试制作一个使用 EJB 依赖注入机制的简单企业应用程序。我试图注入的对象是不同的(非通用的)class,它们都实现了相同的(通用的)接口,并且也作为该接口的类型暴露给它们包含的 class。问题是 EJB 不知道使用什么 class 来实例化包含 class 的所述对象。我将如何解决这个问题?
(对错误的代码格式表示歉意)
我要注入的 classes 是:
@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);
}
最后,他们包含的class是:
@Dependent
public class Service implements IService {
@EJB
private ITimeStampedDataRepository<Humidity> humidityRepository;
@EJB
private ITimeStampedDataRepository<Temperature> temperatureRepository;
...
}
您有两个选择:
1.Give 您的 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;