【问题标题】:when I start Spring project,the controller method will be called three times当我启动 Spring 项目时,控制器方法将被调用 3 次
【发布时间】:2016-05-05 12:05:16
【问题描述】:

我使用的是 Spring 4.2.5。当我第一次运行 Spring 项目并访问localhost 时,映射的控制器方法将被调用 3 次。之后,当我访问localhost 时,它只被调用一次。

如果你不明白我的意思,请评论,因为我的英语不是很好。

public class AppWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[] { RootConfig.class };
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[] {
                WebConfig.class
        };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }

    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("utf-8");
        characterEncodingFilter.setForceEncoding(true);
        return new Filter[]{characterEncodingFilter};
    }

}

还有我的网络配置

@Configuration
@EnableWebMvc
@ComponentScan({"kyzs.web"})
public class WebConfig extends WebMvcConfigurerAdapter {
    @Bean
    public ViewResolver viewResolver(SpringTemplateEngine templateEngine) {
        ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
        viewResolver.setCharacterEncoding("utf-8");
        viewResolver.setTemplateEngine(templateEngine);
        return viewResolver;
    }
    @Bean
    public SpringTemplateEngine templateEngine() {
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.setTemplateResolver(mainResolver());
        return templateEngine;
    }

    @Bean
    public TemplateResolver mainResolver() {
        TemplateResolver templateResolver = new ServletContextTemplateResolver();
        templateResolver.setPrefix("/WEB-INF/views/");
        templateResolver.setSuffix(".html");
        templateResolver.setTemplateMode("HTML5");
        templateResolver.setCharacterEncoding("utf-8");
        templateResolver.setCacheable(false);
        return templateResolver;
    }


    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
}

控制器

@Controller
public class HomeController {

    @Autowired
    private HttpLogin httpLogin;

    @RequestMapping(value = "/",method = RequestMethod.GET)
    public String home(){
        System.out.println("home");   //print three times ,when first called.
        return "home";
    }

}

我的 pom.xml

<packaging>war</packaging>

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf-spring4</artifactId>
            <version>2.1.4.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.9.1</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

    </dependencies>

日志

2016-05-10 14:59:04 DEBUG DispatcherServlet:139 - Servlet 'dispatcher' configured successfully
[2016-05-10 02:59:04,136] Artifact KyZsBackend:war: Artifact is deployed successfully
[2016-05-10 02:59:04,136] Artifact KyZsBackend:war: Deploy took 4,901 milliseconds
2016-05-10 14:59:04 DEBUG DispatcherServlet:861 - DispatcherServlet with name 'dispatcher' processing GET request for [/]
2016-05-10 14:59:04 DEBUG RequestMappingHandlerMapping:301 - Looking up handler method for path /
2016-05-10 14:59:04 DEBUG RequestMappingHandlerMapping:308 - Returning handler method [public java.lang.String kyzs.web.HomeController.home()]
2016-05-10 14:59:04 DEBUG DefaultListableBeanFactory:251 - Returning cached instance of singleton bean 'homeController'
2016-05-10 14:59:04 DEBUG DispatcherServlet:947 - Last-Modified value for [/] is: -1
home
2016-05-10 14:59:04 DEBUG DispatcherServlet:1240 - Rendering view [org.thymeleaf.spring4.view.ThymeleafView@2b57f853] in DispatcherServlet with name 'dispatcher'
2016-05-10 14:59:04 DEBUG DispatcherServlet:998 - Successfully completed request
2016-05-10 14:59:04 DEBUG DispatcherServlet:861 - DispatcherServlet with name 'dispatcher' processing GET request for [/]
2016-05-10 14:59:04 DEBUG RequestMappingHandlerMapping:301 - Looking up handler method for path /
2016-05-10 14:59:04 DEBUG RequestMappingHandlerMapping:308 - Returning handler method [public java.lang.String kyzs.web.HomeController.home()]
2016-05-10 14:59:04 DEBUG DefaultListableBeanFactory:251 - Returning cached instance of singleton bean 'homeController'
2016-05-10 14:59:04 DEBUG DispatcherServlet:947 - Last-Modified value for [/] is: -1
home
2016-05-10 14:59:04 DEBUG DispatcherServlet:1240 - Rendering view [org.thymeleaf.spring4.view.ThymeleafView@2b57f853] in DispatcherServlet with name 'dispatcher'
2016-05-10 14:59:04 DEBUG DispatcherServlet:998 - Successfully completed request
2016-05-10 14:59:05 DEBUG DispatcherServlet:861 - DispatcherServlet with name 'dispatcher' processing GET request for [/]
2016-05-10 14:59:05 DEBUG RequestMappingHandlerMapping:301 - Looking up handler method for path /
2016-05-10 14:59:05 DEBUG RequestMappingHandlerMapping:308 - Returning handler method [public java.lang.String kyzs.web.HomeController.home()]
2016-05-10 14:59:05 DEBUG DefaultListableBeanFactory:251 - Returning cached instance of singleton bean 'homeController'
2016-05-10 14:59:05 DEBUG DispatcherServlet:947 - Last-Modified value for [/] is: -1
home
2016-05-10 14:59:05 DEBUG DispatcherServlet:1240 - Rendering view [org.thymeleaf.spring4.view.ThymeleafView@2b57f853] in DispatcherServlet with name 'dispatcher'
2016-05-10 14:59:05 DEBUG DispatcherServlet:998 - Successfully completed request

【问题讨论】:

  • 你能为org.springframework.web包添加一些DEBUG级别的日志吗?
  • 尝试在您的配置中删除configurer.enable();。现在会发生什么?
  • 您是如何部署您的应用程序的?您是否在 Tomcat 中使用 IntelliJ 及其运行配置?
  • 是的。我使用 IntelliJ 及其与 Tomcat 的运行配置

标签: java spring spring-mvc intellij-idea


【解决方案1】:

这是 IntelliJ 的 After Launch 功能调用您的网络应用程序三次。您的 Spring 配置没有任何问题。为了解决这个问题,只需在 IntelliJ 中转到 Edit Configuration 并取消选中 After Launch 复选框:

【讨论】:

  • 你是英雄。
  • 我花了 4 个小时调试这个问题,它来自 intellij!为什么要通过调用它 3 次来做这件事?不管怎样,你让我很开心,谢谢。
【解决方案2】:

检查您的 pom.xml,我认为某些依赖项或参数从那里被调用了更多次。例如,确保已正确配置。 dispatcher-servlet 应该在你的 pom 或者其他配置文件中被调用一次。

即便如此,你能不能试试这个配置。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.company</groupId>
    <artifactId>test-proyect</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>     

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf-spring4</artifactId>
            <version>2.1.4.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.9.1</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>    

</project>

WebConfig.java

@Configuration
@EnableWebMvc
@ComponentScan("kyzs.web")
public class WebConfig extends WebMvcConfigurerAdapter{

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

    @Bean
    UrlBasedViewResolver resolver(){
        UrlBasedViewResolver resolver = new UrlBasedViewResolver();

        resolver.setPrefix("/WEB_INF/views/");
        resolver.setSuffix(".html");
        resolver.setViewClass(JstlView.class);

        return resolver;
    }

}

AppWebInitializer.java

public class AppWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer{
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[] { WebConfig.class };
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[0];
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }

}

【讨论】:

  • 我没有其他配置文件。我发了pom.xml。请帮我检查
  • 好的,让我检查一下。运行时控制台上没有错误或警告?
  • 好的,你能检查一下吗。它正常运行并打印一次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-19
  • 2016-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
相关资源
最近更新 更多