2010-04-05 3 views
10

주석 기반 컨트롤러 구성을 사용하여 인터셉터를 등록하려고합니다. 제가 말할 수있는 한, 모든 것을 올바르게했습니다. 그러나 인터셉터를 테스트하려고하면 아무 일도 일어나지 않습니다. 로그를보고 나서 다음을 찾았습니다.스프링 이름을 거부하고 URL 경로가 지정되지 않았습니다.

2010-04-04 20:06:18,231 DEBUG [main] support.AbstractAutowireCapableBeanFactory (AbstractAutowireCapableBeanFactory.java:452) - Finished creating instance of bean  'org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping#0' 
2010-04-04 20:06:18,515 DEBUG [main] handler.AbstractDetectingUrlHandlerMapping (AbstractDetectingUrlHandlerMapping.java:86) - Rejected bean name 'org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping#0': no URL paths identified 
2010-04-04 20:06:19,109 DEBUG [main] support.AbstractBeanFactory (AbstractBeanFactory.java:241) - Returning cached instance of singleton bean 'org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping#0' 

이 로그 조각의 두 번째 줄을보십시오. Spring이 DefaultAnnotationHandlerMapping 빈을 거부하고 있는가? 그렇다면 내 인터셉터가 작동하지 않는 문제가있을 수 있습니까? 여기

내 응용 프로그램 컨텍스트입니다 :

여기
<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:mvc="http://www.springframework.org/schema/mvc"  
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-3.0.xsd 
     http://www.springframework.org/schema/mvc 
     http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd" 
default-autowire="byName"> 

<!-- Configures the @Controller programming model --> 
<mvc:annotation-driven /> 

<!-- Scan for annotations... --> 
<context:component-scan base-package=" 
    com.splash.web.controller, com.splash.web.service, com.splash.web.authentication"/> 

<bean id="authorizedUserInterceptor" class="com.splash.web.handler.AuthorizedUserInterceptor"/> 

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
    <property name="interceptors"> 
     <list> 
      <ref bean="authorizedUserInterceptor"/> 
     </list> 
    </property> 
</bean> 

내 인터셉터입니다 :

package com.splash.web.handler; 

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.apache.log4j.Logger; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; 

    public class AuthorizedUserInterceptor extends HandlerInterceptorAdapter { 

    @Override 
    public boolean preHandle(HttpServletRequest request, 
      HttpServletResponse response, Object handler) throws Exception { 

     log.debug(">>> Operation intercepted...");   

     return true; 
    }  
} 

사람이 잘못 아무것도 볼 수 있는가가? 위에서 언급 한 오류가 실제로 의미하는 바는 무엇이며 호출자가 아닌 인터셉터에 어떤 영향을 줄 수 있습니까? 감사!

+0

다음에 사용합니다. –

답변

16

표시되는 내용은 <mvc:annotation-driven />과 명시 적 bean 정의 DefaultAnnotationHandlerMapping 사이의 충돌입니다.

<mvc:annotation-driven />을 추가하면 Spring은 자신의 DefaultAnnotationHandlerMapping을 선언하고 자신의 앞에 표시되기 때문에 우선 순위를 얻습니다. 귀하의 인터셉터는 DefaultAnnotationHandlerMapping에 등록되어 있지만 실제로는 호출되지 않습니다.

<mvc:annotation-driven />을 제거하고 다시 시도해보십시오.

+0

주석 처리에 감사드립니다. 그래서이 태그와 같은 일을하는 내 자신의 DefaultAnnotationHandlerMapping을 추가하고 있습니까? 나는 이것에 대해 조금 더 읽을 필요가 있다고 생각한다. – richever

+1

@richever :''크게 (잘하면 3.0.2 문서에 대한 수정 될 것이다 생략)를 문서화하지만, 본질적으로 그것은 당신에게 절약, 핸들러 맵핑과 당신을 위해 어댑터의 무리를 등록한다 케이스의 90 %에서 혼자서하는 것이 혼란 스럽다. - 그러나 당신의 경우에는 그렇지 않다. :) – skaffman

관련 문제