2011-08-05 9 views
2

내가CDI : 같은 Bean의 인터셉트되지 않은 메소드로부터의 인터셉트 된 메소드 중첩 호출 - 호출되어야 하는가?

public List<IrcEvent> getEventsByCriteria(IrcEventCriteria crit, boolean descending) { 
    return getEventsByCriteria(crit, 0, Integer.MAX_VALUE, descending); 
} 

@JpaTransactional 
public List<IrcEvent> getEventsByCriteria(IrcEventCriteria crit, int first, int count, boolean descending) { 
    ... 
} 

메소드를 가지고 있다면 첫 번째 메소드는 @JpaTransactional에 주석을 달아야합니다.

빈이 자체 인터셉트 된 메소드를 호출하면 인터셉터가 트리거되지 않는다는 것을 알았습니다. 프록시라고 부르는 것이 아니기 때문에 그것이 "실제 인스턴스"라고 가정합니다. 따라서 프록시를 통과하지 않습니다.

이 문제는 spec/docs에서 다루고 있습니까? 나는 아직 그것을 찾지 못했다. 내가 모든 공개 메소드에 주석을 달면 장래에 여러 번 인터셉터를 호출하지 않을 것이기 때문에 나는 묻는다.

답변

1

스펙에서 본 것을 기억할 수는 없지만 프록시가 작동하는 방식입니다. 그러나 어쨌든 이것은 트랜잭션 전파와 관련이 있습니다. 기존의 실행중인 트랜잭션과 함께 트랜잭션 방식을 호출하면 새로운 트랜잭션을 시작해야하는지 아닌지 여부입니다.

받기

+1

'그렇지만 그건 프록시가 작동하는 방법입니다. 그것은 EJB에서 동일합니다. 빈이 자체 메소드를 호출하면 프록시를 거치지 않습니다. 따라서 트랜잭션 속성이 'not-supported'인 메소드가 트랜잭션 속성이 'required'인 자체 메소드를 호출하면 TX가 시작되지 않아 다소 혼란 스러울 수 있습니다. –

+0

Ad Seam 3 -이 Java SE 앱이므로 간단한 트랜잭션 전파를 직접 구현했습니다. –

1

가 차단하지 그래서 제 2 회 "내부"전화는 더 이상 상황에 맞는 기준을 통해되지 않습니다 (트랜잭션 지원) Seam 3 persistence 모듈.