2008-08-18 41 views
4

假設你有以下EJB 3個接口/類:如何用泛型參數覆蓋EJB 3會話bean方法 - 如果可能的話?

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訪問該FooRepository豆:

//... 
@EJB 
private FooRepository fooRepository; 

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

但是,永遠不會執行壓倒一切的方法時的刪除方法調用FooRepository bean。而只執行在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,它可能會更容易調試。