Как я могу переопределить метод сеансового компонента EJB 3 с помощью универсального аргумента - если это вообще возможно?

Предположим, у вас есть следующие интерфейсы / классы 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
}

А затем еще один bean-компонент, который обращается к bean-компоненту FooRepository:

//...
@EJB
private FooRepository fooRepository;

public void someMethod(Foo foo)
{
    fooRepository.delete(foo);
}
//...

Однако метод переопределения никогда не выполняется, когда вызывается метод удаления компонента FooRepository. Вместо этого выполняется только реализация метода удаления, определенного в AbstractRepository.

Что я делаю не так, или это просто ограничение Java / EJB 3, которое пока несовместимо с обобщениями и наследованием?

Сегодня он работал, не меняя ни строчки кода. Значит, что-то еще пошло не так со средой выполнения, отладчиком или чем-то еще ... Спасибо за ответы!

Martin Klinke 19.08.2008 15:19
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
1
3 993
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Можете ли вы написать модульный тест для вашего класса FooRepository, просто используя его как POJO. Если это сработает так, как ожидалось, я не знаю ни одной причины, по которой он будет работать по-другому внутри контейнера.

Я подозреваю, что происходит что-то еще, и, вероятно, будет легче отладить, если вы протестируете его как POJO.

Ответ принят как подходящий

Я пробовал с 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);
       }
}

Другие вопросы по теме