2011-11-22 3 views
3

나는 AOP에 대한 주석을 작성했습니다. 컨트롤러 메서드가 아닌 모든 메서드에서 사용할 때 제대로 작동합니다. 그러나 내 컨트롤러의 방법으로 사용할 때 컨트롤러가 작동을 멈 춥니 다. 매핑에 대해 404 찾을 수없는 오류를 제공하기 시작합니다. 나는 비슷한 질문을 여기에 발견 : Spring 3 MVC @Controller with AOP interceptors?하지만 나는 그것을 어떻게 해야할지 모르겠다.스프링 컨트롤러에서 Aop 주석이 작동하지 않습니다.

public interface BaseController<T> { 

    public List<T> getAll(HttpServletResponse response); 

    public T getByName(HttpServletResponse response, String id); 

    public T create(HttpServletResponse response, T t); 

    public T update(HttpServletResponse response, T t); 

} 

어떤 조언 : 내 컨트롤러를 구현

@WebAuditable // This is my annotation that works at other methods 
@Override 
@RequestMapping(value = "/ad", method = RequestMethod.POST, headers = "Accept=application/json") 
public 
@ResponseBody 
Cd create(HttpServletResponse response, @RequestBody Cd cd) { 
    ... 
} 

내 인터페이스가 있습니다 : 내 컨트롤러에서 나의 방법이다?

PS : @SeanPatrickFloyd는 말한다 :

주 컨트롤러 인터페이스 (AOP 프록시를위한 예를 들면), 지속적으로 모든 매핑 주석을 넣어 가 있는지 확인을 사용하여 - 같은 @RequestMapping와 @SessionAttributes - 컨트롤러 인터페이스 보다는 구현 클래스에

답변

3

건은 다음과 같습니다 컨트롤러 매핑이 실행시 수행, 당신은 AOP 프록시를 사용하는 경우, 홍보한다 옥시 오브젝트는 런타임시 주석이 없으므로 인터페이스 만 수행합니다. 이 제한을 해결하기위한 두 가지 가능한 전략을 생각해 볼 수 있습니다.

일반 인터페이스 메소드에 주석을 달거나 (모든 컨트롤러에 조언하지 않으려는 경우) 구현 유형별로 하위 인터페이스를 만들고 명시 적으로 메소드에 주석을 추가하십시오. 나는 이것이 많은 재 작성된 코드이고 AOP가 무엇인지와 반대되는 것을 알고 있지만 인터페이스 기반 프록시를 고수 할 때 더 좋은 방법을 모른다.

또 다른 방법은 proxy-target-class = "true"를 사용하여 CGLib 프록시로 전환하는 것입니다. 프록시 클래스는 이런 식으로 주석을 유지해야합니다.

업데이트 : JDK 프록시는 인터페이스의 지원 아니에요 정보를 노출하지 않기 때문에 (그것이 작동하는 경우) 인터페이스를 주석하는 것은 다음과 같이 작동합니다

public interface BaseController<T> { 

    @WebAuditable 
    public List<T> getAll(HttpServletResponse response); 

    @WebAuditable 
    public T getByName(HttpServletResponse response, String id); 

    @WebAuditable 
    public T create(HttpServletResponse response, T t); 

    @WebAuditable 
    public T update(HttpServletResponse response, T t); 

} 

기본 클래스에 주석 달기가 작동하지 않습니다.

+0

감사합니다. 어떻게 일반 메서드에 주석을 추가 할 것인가? 예제를 보여 줄 수 있습니까? 모든 컨트롤러가이를 구현하는 기본 컨트롤러 인터페이스가 있습니다. (실제로 거기에 BaseController 구현하는 abstract 클래스를 있지만 해당 업데이트 된 삭제 메서드를 구현하지 않습니다 컨트롤러를 구현하는) 그래서 내 BaseController 주석을 사용하여 해당 문제를 해결할 수 및 내 질문에서 나를 보여줄 수있는 주석을 어떻게? – kamaci

+0

@kamaci 내 업데이트를 참조하십시오. –

+0

인터페이스를 시도했지만 작동하지 않았습니다. 나는 그것을 할 어떤 방법을 찾을 수 없었다. 두 번째 충고는 어때? – kamaci

관련 문제