2008-08-18 6 views
4

Предположим, у вас есть следующие EJB 3 интерфейсы/классы:Как я могу переопределить метод bean-компонента 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); 
} 
//... 

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

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

+0

Сегодня он работал без изменения какой-либо строки кода. Так что что-то еще, должно быть, пошло не так с средой выполнения, отладчиком или чем-то еще ... Спасибо за ваши ответы! – 2008-08-19 11:19:40

ответ

2

Я попробовал его с помощью 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); 
     } 
} 
1

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

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