Spring отклоняет имя компонента, URL-адреса не указаны - PullRequest
10 голосов
/ 05 апреля 2010

Я пытаюсь зарегистрировать перехватчик, используя конфигурацию контроллера на основе аннотаций. Насколько я могу судить, я все сделал правильно, но когда я пытаюсь проверить перехватчик, ничего не происходит. Посмотрев в логах я обнаружил следующее:

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 отклоняет bean-компонент 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;
    }    
}

Кто-нибудь видит что-то не так с этим? Что на самом деле означает ошибка, о которой я упоминал выше, и может ли она иметь какое-то отношение к тому, что перехватчик не вызывается? Спасибо!

Ответы [ 2 ]

17 голосов
/ 05 апреля 2010

То, что вы видите, является конфликтом между <mvc:annotation-driven /> и явным определением бина DefaultAnnotationHandlerMapping.

Когда вы добавляете <mvc:annotation-driven />, Spring объявляет свой собственный DefaultAnnotationHandlerMapping, и, поскольку он появляется перед вашим собственным, он получает приоритет. Ваш перехватчик зарегистрирован на вашем DefaultAnnotationHandlerMapping, но на самом деле он никогда не вызывается.

Попробуйте удалить <mvc:annotation-driven /> и повторите попытку.

5 голосов
/ 02 мая 2010

найдено из http://forum.springsource.org/showthread.php?t=81238. Используйте

<mvc:annotation-driven/>

, а затем

<mvc:interceptors> <bean class="com.splash.web.handler.AuthorizedUserInterceptor"/></mvc:interceptors>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...