2008-08-18 2 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 bean이 호출됩니다. 대신, AbstractRepository에 정의 된 delete 메소드의 구현 만 실행됩니다.

무엇이 잘못 되었나요? 아니면 generics와 상속이 잘 조화되지 않는 Java/EJB 3의 한계입니까?

+0

오늘 코드 줄을 변경하지 않고 작동했습니다. 그래서 뭔가 다른 런타임 환경, 디버거 또는 뭔가 잘못 갔어야합니다 ... 답해 주셔서 감사합니다! –

답변

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

그냥 POJO로 사용하여 FooRepository 클래스에 대한 단위 테스트를 작성할 수 있습니까? 그것이 예상대로 작동한다면 컨테이너 내부에서 다르게 작동하는 이유는 잘 모르겠습니다.

나는 뭔가 다른 일이 벌어지고 있으며, POJO로 테스트하면 디버깅하기가 더 쉬울 것이라고 생각합니다.

관련 문제