2016-04-14 7 views
1

Я начинаю с весенних перехватчиков и хотел просто зарегистрировать время вызова каждого запроса.Весенний перехватчик не вызван

Мой Перехватчик класс:

package com.ankit.notice.interceptor; 

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

import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; 

public class ExecuteTimeInterceptor extends HandlerInterceptorAdapter{ 

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

     long startTime = System.currentTimeMillis(); 
     System.out.println("Time is " + startTime); 
     return true; 
    } 
} 

корня context.xml

<?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:mvc="http://www.springframework.org/schema/mvc" 
    xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-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.xsd"> 

<!-- Root Context: defines shared resources visible to all other web components --> 

<context:component-scan base-package="com.ankit.notice" /> 
<mvc:annotation-driven></mvc:annotation-driven> 
<mvc:interceptors> 
    <bean class="com.ankit.notice.interceptor.ExecuteTimeInterceptor" /> 
</mvc:interceptors> 

    ..... 
</beans> 

контроллер класса

@RequestMapping(value = "api/getAllItems.rest", method =  RequestMethod.GET) 
    public ResponseEntity<Map<String, Object>> getAllItems(
     HttpServletRequest request, HttpServletResponse response, HttpSession session) { 
     ResponseEntity<Map<String, Object>> responseEntity = null; 
     Map<String, Object> responseParams = new HashMap<String, Object>(); 

     try { 
      User user = (User) session.getAttribute("user"); 
      if ((null == user) || (user.getId() < 0)) { 
       throw new MNPSessionException(
         "INVALID USER : Session attribute user is not set correctly"); 
      } 
     .... 
    } 

У меня нет сопоставления запросов для класса контроллера, вместо этого я сопоставляю запросы непосредственно с методами. (Я знаю, что это плохая практика, но я работаю над этим :))

web.xml

 <?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 


http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 

<!-- The definition of the Root Spring Container shared by all Servlets and Filters --> 
<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/spring/root-context.xml</param-value> 
</context-param> 

<context-param> 
    <param-name>defaultHtmlEscape</param-name> 
    <param-value>true</param-value> 
</context-param> 

<!-- Creates the Spring Container shared by all Servlets and Filters --> 
<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<!-- Processes application requests --> 
<servlet> 
    <servlet-name>appServlet</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>appServlet</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 
<servlet-mapping> 
    <servlet-name>appServlet</servlet-name> 
    <url-pattern>*.htm</url-pattern> 
</servlet-mapping> 
<servlet-mapping> 
    <servlet-name>appServlet</servlet-name> 
    <url-pattern>*.json</url-pattern> 
</servlet-mapping> 
    <servlet-mapping> 
    <servlet-name>appServlet</servlet-name> 
    <url-pattern>*.rest</url-pattern> 
</servlet-mapping> 

<filter> 
    <filter-name>sessionCheckFilter</filter-name> 
    <filter-class>com.ankit.notice.util.SessionCheckFilter</filter-class> 
</filter> 

filter-mapping> 
<filter-name>sessionCheckFilter</filter-name> 
<url-pattern>*</url-pattern> 
</filter-mapping> 
</web-app> 

URL запросаlocalhost:8080/mvc/api/getAllItems.rest

Согласно моему пониманию, так как в теге mvc:interceptors отображение не отображается, перехватчик должен вызываться для всех запросов.

В моей консоли нет выходов sysout. Я попытался вернуть false, чтобы убедиться, что нет проблем с перехватчиками и sysout, но безрезультатно.

Кроме того, я попытался удалить метку mvc:annotation-driven, но перехватчик не вызывается.

Любые указания, что может быть неправильным здесь? Были и другие варианты, такие как создание bean класса BeanNameUrlHandlerMapping и создание bean класса RequestMappingHandlerMapping со свойствами: list и mapping, но ни один из них не работает. Может ли кто-то указать на разницу между этими методами и дать указания, когда их использовать?

+0

Какой URL-адрес запроса вы тестируете. Предоставьте класс контроллера и конфигурацию web.xml и приложений –

ответ

0

я бы поклясться, что вы забыли «MVC: перехватчик» тег внутри «MVC: перехватчики» метки:

Не могли бы вы попробовать следующее?

<mvc:interceptors> 
 
    
 
    <mvc:interceptor> 
 
     <mvc:mapping path="/**" /> 
 
     <bean id="executeTimeInterceptor" class="com.ankit.notice.interceptor.ExecuteTimeInterceptor" /> 
 
    </mvc:interceptor> 
 
    
 
</mvc:interceptors>

+0

Я попробовал то же самое, прежде чем отправлять вопрос, но это не сработало. – ankshah

+0

Извините, попросив еще раз, но пытались ли вы включить mvc: mapping path = "/ **" в определении перехватчика компонента?Другой вопрос: не могли бы вы попытаться сделать более простой тест только с весенним контекстом? У вас есть как root-context.xml, так и servlet-context.xml .... может быть Вы можете попробовать только с одним сервлетом-context.xml и переместить ваш перехватчик бобов там ... –

+0

Да, я пробовал это, не сделал Работа. Кроме того, вы имеете в виду web.xml, когда вы говорите servlet-context.xml? Если да, то в соответствии с весенними документами перехватчики должны быть определены в контексте приложения i.e root-context.xml здесь. Пожалуйста, обратитесь к [spring docs advisory] (http://docs.spring.io/autorepo/docs/spring/3.2.4.RELEASE/javadoc-api/org/springframework/web/servlet/HandlerInterceptor.html) – ankshah

0

Чтобы "переопределить" перехватчик я использовал класс конфигурации аннотированный с@Configuration (созданный в пакете "конфигурации").

Нет необходимости использовать конфигурацию xml.

package com.abc.config; 

import org.springframework.context.annotation.Configuration; 
import org.springframework.core.Ordered; 
import org.springframework.web.servlet.config.annotation.InterceptorRegistry; 
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; 
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; 

import com.abc.interceptor.BaseInterceptor; 

@Configuration 
public class WebConfig extends WebMvcConfigurerAdapter { 

    @Override 
    public void addInterceptors(InterceptorRegistry registry) { 
     registry.addInterceptor(new BaseInterceptor()); 
    } 

} 
Смежные вопросы