Как я могу переопределить метод сессионного компонента EJB 3 с общим аргументом - если это вообще возможно?[закрыто]
-
08-06-2019 - |
Вопрос
Предположим, у вас есть следующие интерфейсы / классы EJB 3:
public interface Repository<E>
{
public void delete(E entity);
}
public abstract class AbstractRepository<E> implements Repository<E>
{
public void delete(E entity){
//...
}
}
public interface FooRepository<Foo>
{
//other methods
}
@Local(FooRepository.class)
@Stateless
public class FooRepositoryImpl extends
AbstractRepository<Foo> implements FooRepository
{
@Override
public void delete(Foo entity){
//do something before deleting the entity
super.delete(entity);
}
//other methods
}
А затем еще один компонент, который обращается к FooRepository
фасоль :
//...
@EJB
private FooRepository fooRepository;
public void someMethod(Foo foo)
{
fooRepository.delete(foo);
}
//...
Однако переопределяющий метод никогда не выполняется, когда метод delete из FooRepository
боб называется.Вместо этого используется только реализация метода delete, который определен в AbstractRepository
выполняется.
Что я делаю не так, или это просто ограничение Java / EJB 3 в том, что дженерики и наследование пока плохо сочетаются?
Решение
Я попробовал это с pojo, и, кажется, это сработало.Мне пришлось немного изменить ваш код.Я думаю, что ваши интерфейсы были немного не в порядке, но я не уверен.
Я предположил, что "Foo" - это конкретный тип, но если нет, я могу провести для вас еще несколько тестов.
Я только что написал основной метод для проверки этого.Я надеюсь, что это поможет!
public static void main(String[] args){
FooRepository fooRepository = new FooRepositoryImpl();
fooRepository.delete(new Foo("Bar"));
}
public class Foo
{
private String value;
public Foo(String inValue){
super();
value = inValue;
}
public String toString(){
return value;
}
}
public interface Repository<E>
{
public void delete(E entity);
}
public interface FooRepository extends Repository<Foo>
{
//other methods
}
public class AbstractRespository<E> implements Repository<E>
{
public void delete(E entity){
System.out.println("Delete-" + entity.toString());
}
}
public class FooRepositoryImpl extends AbstractRespository<Foo> implements FooRepository
{
@Override
public void delete(Foo entity){
//do something before deleting the entity
System.out.println("something before");
super.delete(entity);
}
}
Другие советы
Можете ли вы написать модульный тест для своего класса FooRepository, просто используя его как POJO?Если это работает так, как ожидалось, то я не знаком с какой-либо причиной, по которой это будет функционировать по-другому внутри контейнера.
Я подозреваю, что происходит что-то еще, и, вероятно, будет легче отлаживать, если вы протестируете это как POJO.