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

голоса
4

Предположим, у вас есть следующие 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, дженерики и наследование не играют хорошо вместе еще?

Задан 18/08/2008 в 16:34
источник пользователем
На других языках...                            


2 ответов

голоса
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);
       }
}
Ответил 18/08/2008 в 22:51
источник пользователем

голоса
1

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

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

Ответил 18/08/2008 в 18:04
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more