2012-11-27 3 views
0

우리의 응용 프로그램에 다음과 같은 레이어와 상호 작용이 있습니다AOP와 예외 문제

보기 (JSP) -> Ajax 호출 -> MyController에 (구현 봄 컨트롤러) -> 사용자 정의 서비스 조회를 통해 ->이면 MyService를 (기본 서비스 구현) -> My DAOimpl

우리의 아이디어는 예외 로깅을 위해 AOP를 사용하는 것이다. AOP 인터셉터를 간단하게 유지하기 위해 우리는 컨트롤러에서 커트를 정의하기로 결정했습니다. 컨트롤러에는 handleLequest 메소드에서 호출되는 onLoad, onUpdate (CRUD 연산과 관련 있음)와 같은 몇 가지 메소드가 있으며, 우리는 poitncut에 대해이 메소드를 정의하려고합니다. , 즉 서비스 계층 또는 그 이하의 예외는 버블 링되어 컨트롤러에 도달합니다. 예외 예외를 가로 채고 예외 세부 사항을 로그에 기록하도록 정의 된 AOP pointcut. 결과적으로 오류 코드가 적절하게 표시 될보기로 오류 코드가 다시 전송됩니다.

문제점 : - AOP는 onLoad 등의 메소드에 대한 호출을 차단하지 않습니다. handleRequest에서이 메소드를 호출하면 Controller에서 자체 호출로 처리되고 AOP가이를 가로 채지 않기 때문입니다. - 위의 문제를 피하기 위해 onLoad, onUpdate 메소드 및 onLoad 등 메소드를 구현하는 util 클래스 세트가있는 인터페이스를 만들었습니다. 컨트롤러는 이러한 유틸리티를 구성원으로 갖습니다. Pointcuts는 컨트롤러 대신 이러한 유틸리티에서 정의됩니다. 이 작업을 수행 할 때 AOP 설정이 AOP 선언 용 사용자 정의 xml이 아닌 spring-servlet xml에있는 경우에만 AOP가 작동합니다. 이 관찰은 컨트롤러에만 해당됩니다. AOP 컷이 서비스 레이어에 정의 된 경우 선언은 예상대로 작동합니다 (사용자 정의 XML에서). 스프링 서블릿 xml과 컨트롤러의 컷 사이의 의존성에 대해서는 확실하지 않습니다.

제안 사항 : - 컨트롤러에 대해 AOP를 정의해야합니까? 이것이 서비스 계층에서만 정의되어야 하는가? 컨트롤러에서는 예외가 'catch'되고 오류 메시지가 적절하게 표시됩니다. 원래 접근법에 근본적인 문제가 있는지 확인하고 싶었습니다.

+0

힌트 : 봄 프록시 AOP 대신 실제 AspectJ의 AOP를 사용하는 경우 동일한 인스턴스 ('this.onLoad()')로부터도 호출을 가로 챌 수있을 것이다. – Ralph

답변

0

우리는 우리 제품에서 서비스 계층에서 예외를 잡아 번역을 수행하는 비슷한 것을합니다. 이 번역에는 두 가지 측면이 있습니다. 하나는 물론 I18N과 관련이 있습니다. 다른 번역은 낮은 수준의 예외가 제품에서 나오지 않도록하는 것입니다. 대신 이러한 예외는 일반적인 예외로 변환되어 예외 유출을 방지합니다.

나는 서비스 레이어에서 예외를 잡는 것이 예외 처리에서 자유롭게 하위 레이어를 남겨두기 때문에 좋은 방법이라고 생각한다. 더 이상, 그것은 우리에게 번역 및/또는 다른 행동을 할 수있는 기회를 제공합니다.

감사합니다, 라구