복붙노트

[SPRING] Spring 3 MVC AOP 인터셉터를 가진 @Controller?

SPRING

Spring 3 MVC AOP 인터셉터를 가진 @Controller?

누구나 왜 주석이 달린 MVC 컨트롤러와 함께 AOP를 사용할 수 없다는 것을 알고 있습니까? (포스트 참조). @Controller는 pointcut을 추가하자마자 작동을 멈춘다. 문제는 인터셉터가 호출되지 않고, @Controller가 단순히 작동을 멈추는 것입니다 (로그에서 "매핑 된 URL 경로 [/ xx] 대신 핸들러 'Yyy'에"URL이 없습니다. 식별 된 경로 ").

handlerLapping을 통해 컨트롤러에 인터셉터를 추가하는 메커니즘이 있다는 것을 알고 있지만 내 질문은 AOP 인터셉터에만 해당됩니다. 주석 처리 된 컨트롤러가 Spring 컨테이너에서 다른 pojo처럼 pojos가 아닌가? 그 차이점은 무엇입니까? 왜?

@Controller
@RequestMapping("/user")
public class RestTestImpl implements RestTest {
    @RequestMapping(value="/", method={RequestMethod.GET})
    public @ResponseBody String deleteUsers(String arg) {
        return "Xxxxx";
    }
}

내 servlet-Context에서 나는 :

<context:component-scan base-package="org.xxx.yyy"></context:component-scan>
<mvc:annotation-driven />
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
    . . .
</bean>

모든 것이 잘 작동합니다.

하지만 내가 추가 할 때 :

    <aop:config>
        <aop:pointcut expression="execution(* org.xxx.*(..))" id="pc1"/>
        <aop:advisor advice-ref="hibernateInterceptor"  pointcut-ref="pc1" order="2" />
    </aop:config>

컨트롤러가 컨트롤러가 아니므로 오류가 발생하지 않고 지정된 URL에 대한 바인딩이 중지됩니다.

해결법

  1. ==============================

    1.스프링 MVC 레퍼런스 :

    스프링 MVC 레퍼런스 :

    허락하신다면,이 메모는 잘 숨겨져 있습니다 :-)

  2. ==============================

    2.나는 같은 문제에 부딪쳤고 그 해결책을 발견했다.

    나는 같은 문제에 부딪쳤고 그 해결책을 발견했다.

    사실 컨트롤러 (@Controller로 주석 처리)와 aspect (@Aspect로 주석 처리)는 같은 Spring 컨텍스트에 있어야한다.

    일반적으로 사람들은 dispatch-servlet.xml 또는 xxx-servlet.xml과 기본 applicationContext.xml의 서비스 bean (aspect 포함)에 컨트롤러를 정의합니다. 이거 작동 안 할거야.

    Spring이 MVC 컨텍스트를 초기화 할 때 컨트롤러에 대한 프록시를 만들지 만, aspect가 같은 컨텍스트에 있지 않다면 Spring은 인터셉터를 생성하지 않을 것이다.

    위의 설명은 의존하지 않습니다.

    컨트롤러와 애스펙트가 같은 Spring 컨텍스트에있는 한 모든 조합을 테스트했습니다.

  3. ==============================

    3.당신이 사용하고있는 Spring의 AOP 메커니즘이 목표 클래스를 프록시 클래스로 래핑하여 주석을 잃어 버리거나 원래의 주석이 짜 맞춰진 것이기 때문에 심각한 파기없이 가장 잘 추측 할 수 있습니다.

    당신이 사용하고있는 Spring의 AOP 메커니즘이 목표 클래스를 프록시 클래스로 래핑하여 주석을 잃어 버리거나 원래의 주석이 짜 맞춰진 것이기 때문에 심각한 파기없이 가장 잘 추측 할 수 있습니다.

    나는 더 나은 대답이있을 것이라 확신하며, 더 나은 명확한 방법을 제시 할 것이라고 생각하면서 확장 할 것입니다.

  4. from https://stackoverflow.com/questions/5862991/spring-3-mvc-controller-with-aop-interceptors by cc-by-sa and MIT license