EJB 클라이언트에서 runtimeexception 세부 정보를 숨기는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1037821

문제

(로컬) 세션 Bean을 사용하여 서비스를 노출시키는 JEE5 응용 프로그램이 있습니다.

서비스 실행 중에 내부 결함이 발생하면 javax.ejb.ejbtransactionRolledBackexception에서 jboss (5.0.1)가 Runtimeexception을 던지고 캡슐화합니다.

문제는이 ejbtransactionRolledBackexception을 수신하는 클라이언트 응용 프로그램이 원인 런타임 예외에 대한 정보에 액세스하여 응용 프로그램의 내부 아키텍처를 노출시킬 수 있다는 것입니다. 그리고 나는 그것을 원하지 않습니다.

대신, Jboss가 노출 된 세션 Bean을 단일 (그리고 간단한) 기술적 외환 (원인이 없음)으로 항상 runtimeexception을 캡슐화하기를 원합니다.

이것을 달성하는 가장 좋은 방법은 무엇입니까? (인터셉터 사용? Jboss 구성 사용?)

도움이 되었습니까?

해결책

마지막으로, 이전 답변과 개인 연구를 바탕으로 나는 Folling Solution을 유지했습니다.

서버 결함을 관리하기 위해 전용 인터셉터를 만들었습니다.

public class FaultBarrierInterceptor {

@AroundInvoke
public Object intercept(final InvocationContext invocationContext) throws Exception {
    try {
        return invocationContext.proceed();
    } catch (final RuntimeException e) {
        final Logger logger = Logger.getLogger(invocationContext.getMethod().getDeclaringClass());
        logger.error("A fault occured during service invocation:" +
                "\n-METHOD: " + invocationContext.getMethod() +
                "\n-PARAMS: " + Arrays.toString(invocationContext.getParameters()), e);
        throw new TechnicalException();
    }
}}

던진 기술 예외는 ejbexception을 확장하고 원인을 노출시키지 않습니다.

public class TechnicalException extends EJBException {}

나는이 인터셉터를 모든 공공 서비스에서 사용합니다.

@Stateless
@Interceptors({FaultBarrierInterceptor.class})
public class ShoppingCardServicesBean implements ShoppingCardServices { ...

이것은 구현입니다 결함 장벽 패턴.

모든 런타임 예외는 잡기, 로그인 및 결함이 기술적 예측을 사용하여 클라이언트 (내부 세부 사항없이)에 신호를 보냅니다. 확인 된 예외는 무시됩니다.

runtimeexception 처리는 중앙 집중화되어 모든 비즈니스 방법과 분리됩니다.

다른 팁

모든 runtimeexception은 java.lang.exception을 확장합니다.

EJB 사양은 두 가지 유형의 예외 (응용 프로그램 및 시스템)에 대한 처리를 제공합니다.

시스템 예외를 던지려면 일반적으로 그렇게 할 것입니다.

try {
.... your code ...
}catch(YourApplicationException ae) {
   throw ae;
}catch(Exception e) {
   throw new EJBException(e); //here's where you need to change.
}

시스템 예외의 내부 세부 사항을 숨기려면 간단히 교체하십시오.

throw new EJBException(e); 

와 함께:

throw new EJBException(new TechnicalException("Technical Fault"));

이것이 당신이 찾고 있던 것이기를 바랍니다.

건배

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top