当前位置: 首页 > 知识库问答 >
问题:

Spring MVC基于Java的配置-不检测servlet调度器

邵奇
2023-03-14

我正在编写一个Spring MVC Web应用程序。我正在尝试使用基于Java的配置来配置Spring,但是Spring无法在不添加其他XML配置的情况下检测到我的控制器。

我的前端控制器类如下所示:

package no.magnus.controller; 
public class FrontController extends 
   AbstractAnnotationConfigDispatcherServletInitializer {

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

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

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

我的MVC配置类:

package no.magnus.config;
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"no.magnus"})
public class MvcConfig implements WebMvcConfigurer {

    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver vr = new InternalResourceViewResolver();
        vr.setSuffix(".jsp");
        return vr;
    }
}

简单的家用控制器:

package no.magnus.controller;
@Controller
public class HomeController {

    @RequestMapping("/home")
    public ModelAndView index() {

        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("index");
        return modelAndView;
    }
}

正在尝试访问urlhttp://localhost:8080/home我得到一个404错误。如果我将基于XML的配置添加到web。xml以及xml servlet配置,检测和索引家庭控制器。返回jsp。

子集 web.xml:

<servlet>
  <servlet-name>dispatcher</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet
  </servlet-class>
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
  </init-param>
 </servlet>
 <servlet-mapping>
  <servlet-name>dispatcher</servlet-name>
  <url-pattern>/</url-pattern>
 </servlet-mapping>

dispatcher-servlet.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:ctx="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-4.0.xsd">
    <ctx:annotation-config/>
    <ctx:component-scan base-package="no.magnus"/>

</beans>

http://localhost:8080/home 索引.jsp已成功返回!

我的期望是Spring MVC能够从java代码中检测Spring MVC配置,从而使上述XML配置变得多余。请澄清我的理解是否错误。

谢啦!

├───java
│   └───no
│       └───magnus
│           ├───config
│           │       MvcConfig.java
│           │
│           └───controller
│                   FrontController.java
│                   HomeController.java
│
└───webapp
    │   result.jsp
    │
    └───WEB-INF       
        │   web.xml
        │
        └───jsp
                index.jsp

共有1个答案

史阳晖
2023-03-14

http://localhost:8080/home不会调用您的< code>HomeController的< code > index()-Method(/home-Mapping)-在您发布的url中< code>home是您的应用程序的名称,您需要将< code >“/”映射到index.jsp。

请将您的< code>FrontController更改为:

package no.magnus.config; 
public class FrontController extends 
   AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        // from
        // return new Class[] {MvcConfig.class};
        // to
        return null;
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        // from
        // return null;
        // to
        return new Class[] {MvcConfig.class};
    }

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

您的MvcConfig应该如下所示:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;


@EnableWebMvc
@Configuration
// to also scan subpackages for components
@ComponentScan("no.magnus.**")
public class MvcConfig
        implements
            WebMvcConfigurer {
    @Override
    public void configureDefaultServletHandling(final DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
        WebMvcConfigurer.super.configureDefaultServletHandling(configurer);
    }

    @Override
    public void configureViewResolvers(final ViewResolverRegistry registry) {
        registry.viewResolver(this.jspViewResolver());
        WebMvcConfigurer.super.configureViewResolvers(registry);
    }

    @Bean
    public InternalResourceViewResolver jspViewResolver() {
        final InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setOrder(1);
        // jsp-location!!! - please change it to where your jsp's are located
        viewResolver.setPrefix("/WEB-INF/jsp/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }
}

您的HomeController应该如下所示:

package no.magnus.controller;
@Controller("HomeController")
public class HomeController {

    // for the very first start
    // RequestMapping can be replaced with GetMapping
    @GetMapping("/")
    public ModelAndView index() {

        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("index");
        return modelAndView;
    }
}
 类似资料:
  • 我正在尝试使用Enunciate为我的REST API生成静态文档,该API是使用Spring MVC 3.2用Java编写的。Enuncite网站声称,它通过使用以下特定插件来支持Spring: http://enunciate.codehaus.org/module_spring_app.html 在查看配置选项时,看起来我应该导入一个spring applicationContext.xml

  • 3.12 基于Java的容器配置 {#toc_5} 3.12.1 基本概念:@Bean 和 @Configuration {#toc_6} 最核心的是Spring支持全新的Java配置,例如@Configuration注解的类和@Bean注解的方法。 @Bean注解用来说明通过Spring IoC容器来管理时一个新对象的实例化,配置和初始化的方法。这对于熟悉Spring以XML配置的方式,@Bea

  • 我试图将我现有的基于XML的spring批处理项目转换为基于java的配置。@Autowired对象返回null,尽管我已经在基本包中提到了componentscan。

  • 我正在尝试将dwr包含在使用SpringMVC4.0.5的项目中。项目中使用基于Java的配置。对于基于java的配置,我在MVCConfiguration中使用以下代码行。 扩展类I的WebApplicationInitializer为dwr请求添加了映射。 但是在部署时,它显示错误,说明“应设置所需的‘配置器’属性”。如果配置需要任何修改,请建议如何设置配置器。 将 dwrController

  • pom.xml http://maven.apache.org/xsd/maven-4.0.0.xsd“xmlns=”http://maven.apache.org/pom/4.0.0“xmlns:xsi=”http://www.w3.org/2001/xmlschema-instance“> 堆栈跟踪:

  • 我想做 从映射结构中包含的任何arraylist元素的CEP开始,然后继续我已经开始的其余arraylist元素 地图和图案结构: 我的目的是使用map中的数组列表元素发出警告,但由于其中的流流,数组列表元素的顺序并不重要。我想继续处理这个数组的其余元素,当我从这里的任何数组开始时,我可以返回这个数组的信息。例如: