Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring HandlerInterceptor调用了两次_Java_Spring_Spring Mvc - Fatal编程技术网

Java Spring HandlerInterceptor调用了两次

Java Spring HandlerInterceptor调用了两次,java,spring,spring-mvc,Java,Spring,Spring Mvc,在一个库项目(使用Spring3.2.4)中,我定义了多个拦截器。servlet配置xml文件包含在jar中,将导入web应用程序。拦截器用于多个servlet XML,因为它们应用于具有不同拦截器的不同Dispatcher servlet 问题是,拦截器被调用了两次,而处理程序(控制器)只被调用了一次 拦截器在库项目中定义: public class SomeInterceptor extends HandlerInterceptorAdapter { @Override

在一个库项目(使用Spring3.2.4)中,我定义了多个拦截器。servlet配置xml文件包含在jar中,将导入web应用程序。拦截器用于多个servlet XML,因为它们应用于具有不同拦截器的不同Dispatcher servlet

问题是,拦截器被调用了两次,而处理程序(控制器)只被调用了一次

拦截器在库项目中定义:

public class SomeInterceptor extends HandlerInterceptorAdapter {

        @Override
        public void afterCompletion(final HttpServletRequest request, final HttpServletResponse response, final Object handler, final Exception ex) throws Exception {
            System.out.println("afterCompletionCalled");
        }

        @Override
        public boolean preHandle(final HttpServletRequest request, final HttpServletResponse response, final Object handler) throws Exception {
            System.out.println("preHandle called");
            return true;
        }

        @Override
        public void postHandle(final HttpServletRequest request, final HttpServletResponse response, final Object handler, final ModelAndView modelAndView) throws Exception {
        }
    }
servlet配置在jar文件中提供,稍后包含在应用程序中

libservletcfg.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: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.1.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">

    <context:component-scan base-package="com.example.controller" annotation-config="true" />

    <bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>

    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <ref bean="jacksonMessageConverter"/>
            </list>
        </property>
    </bean>

    <mvc:annotation-driven />

   <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.example.SomeInterceptor"/>
        </mvc:interceptor>    
    </mvc:interceptors>

</beans>

检查是否没有另一个libservletcfg.xml挂起classpath*:将匹配它们。

我们遇到了两次调用拦截器的相同问题,这是因为我们在web.xml以及@Configuration java文件中定义了applicationContext.xml。

您需要使用org.springframework.web.servlet.asynchHandlerInterceptor:

public interface AsyncHandlerInterceptor extends HandlerInterceptor {

    void afterConcurrentHandlingStarted(
            HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception;

}
Spring MVCexecute序列:

preHandle
afterConcurrentHandlingStarted
preHandle
postHandle
afterCompletion
发现并验证了我自己


希望这有帮助

我也面临同样的问题,拦截器被调用了两次。 问题是在根配置类的@ComponentScan声明中,创建了两个实例,一个在web上下文中,另一个在根上下文中


因此,从根上下文中删除拦截器包后,问题得到了解决。

发布一个拦截器被调用两次的处理程序方法示例。在问题中添加了一个示例。尝试调试并检查您的
HandlerInterceptor
的两个实例是否已注册。是否注册了。有两个不同的
HandlerInterceptor
实例。到达断点的顺序:Instance1.preHandle(…)、Instance2.preHandle(…)、Handler、Instance2.postHandle(…)、Instance1.postHandle(…),情况并非如此。我在IDE中搜索了所有配置文件,甚至在提取的war文件中搜索了libservletcfg.xml的出现情况,我只找到了一个。你可能是对的,但因为项目在一段时间前关闭了。我仍然会将你的回答标记为正确,因为这很可能是原因。我不认为,这是事实,因为我只标记了一次,根据这个答案()它是注定要发生的。你的链接不起作用,请更新它好吗?
@Controller
@RequestMapping(value = "/someUrl")
public class SampleController {

    @RequestMapping(method = RequestMethod.POST)
    public @ResponseBody SampleResponseBody sampleMethod(@RequestBody final SampleRequestBody pSampleRequestBody) {
        final SampleResponseBody response = new SampleResponseBody();
        return response;
    }

}
public interface AsyncHandlerInterceptor extends HandlerInterceptor {

    void afterConcurrentHandlingStarted(
            HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception;

}
preHandle
afterConcurrentHandlingStarted
preHandle
postHandle
afterCompletion