2016-12-07 8 views
0

оговоркой: Я довольно новым для всей концепции EJBEJB не удается разрешить ссылки, потому что есть несколько EJBs в приложении с той же интерфейсом

Я пытаюсь сделать простое корпоративное приложение, которое делает использование 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 у, их содержащий класс:

@Dependent 
public class Service implements IService { 

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

    ... 

} 
+0

Dies это работает, если вы используете конкретные классы? '@EJB личная влажностьРазличная влажностьRepository; @ EJB приватная температураРезопасная температура Репозиторий; ' –

ответ

1

У вас есть два варианта:

1.Give имя для EJBs:

@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

Благодарим вас за короткий и ясный ответ, Леонардо. Именование моих EJB, а затем инъекция их, обращаясь к их имени, действительно решила исходную проблему. Однако я столкнулся с другой проблемой, когда пытался сделать два класса репозитория расширением подкласса, чтобы избавиться от большого количества дубликатов кода. Контейнер EJB снова не смог разрешить классы для инъекций, но я решил эту проблему самостоятельно, добавив аннотацию @Remote к классам репозитория. – Exevan

+0

ОБНОВЛЕНИЕ предыдущий комментарий я нужно добавить следующую строку в GlassFish-EJB-jar.xml отключить GlassFish имена JNDI, чтобы получить все, чтобы работать должным образом: <отключить-непереносимые-JNDI-имена> True Exevan