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;