【问题标题】:Spring MVC Dispatcher unable to find controller handler methodSpring MVC Dispatcher 找不到控制器处理程序方法
【发布时间】:2019-03-28 08:58:39
【问题描述】:

我遇到了有史以来最奇怪的错误。在我的日志中,它验证我已经为“TrainingRequest”创建了一个映射

018-10-23 21:58:43,900 [main] [INFO] o.s.w.s.m.m.a.RequestMappingHandlerMapping - 映射“{[/TrainingRequest],methods=[GET]}”

但是当我尝试去页面http://localhost:8080/WEB/TrainingRequest时, 我得到一个 404 页,日志显示调度程序无法找到映射。它在下面读作

2018-10-23 22:00:17,129 [http-nio-8080-exec-1] [DEBUG] o.s.w.s.m.m.a.RequestMappingHandlerMapping - 没有找到 [/TrainingRequest] 的处理程序方法 2018-10-23 22:00:17,132 [http-nio-8080-exec-1] [WARN] osweb.servlet.PageNotFound - 在 DispatcherServlet 中找不到带有 URI [/WEB/TrainingRequest] 的 HTTP 请求的映射

http://localhost:8080/WEB/ 工作正常,所以我怀疑这是配置问题。但是,这里是下面的 sn-ps。如果您认为问题可能是文件结构,这里是我的 github link

WebConfig.Java

@EnableWebMvc
@Configuration
@ComponentScan(basePackages = "com.project.LNUProject.config")
@Slf4j
public class WebConfig implements WebMvcConfigurer {

    // == constants ==
    public static final String RESOLVER_PREFIX = "/WEB-INF/view/";
    public static final String RESOLVER_SUFFIX =".jsp";

    // == bean methods
    @Bean
    public ViewResolver viewResolver() {
        UrlBasedViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix(RESOLVER_PREFIX);
        viewResolver.setSuffix(RESOLVER_SUFFIX);
        return viewResolver;
    }

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        log.info("registry add properly");
        registry.addViewController("/").setViewName(ViewNames.HOME);
    }
}

ConstantsController.java

@Controller
@Slf4j
public class ConstantsController {
    // == handler methods ==
    // http://localhost:8080/WEB/
    @GetMapping("/")
    public String home() {
        log.info("Home template map");
        return ViewNames.HOME;
    }
}

RequestTraining.java

@Controller
@Slf4j
public class RequestTrainingController {

    final String NAME = "TrainingRequest";

    // == handler methods ==
    // http://localhost:8080/WEB/TrainingRequest
    @GetMapping(NAME)
    public String TableView() {
        log.info("Training VIEW being called");
        return NAME;
    }

    @GetMapping(Mappings.HOME + NAME + Mappings.EDIT)
    public String EditTableView() {
        return NAME + Mappings.EDIT;
    }

    @GetMapping(Mappings.HOME + NAME + Mappings.DELETE)
    public String DeleteTableView() {
        return NAME + Mappings.DELETE;

    }

    @GetMapping(Mappings.HOME + NAME + Mappings.ADD)
    public String AddTableView() {
        return NAME + Mappings.ADD;
    }
}

【问题讨论】:

  • 你可以试试@RestController 代替@Controller 吗?

标签: spring spring-mvc spring-boot spring-config


【解决方案1】:

在您的addViewController 方法中缺少TrainingRequest 的映射

做这样的事情

@Override
    public void addViewControllers(ViewControllerRegistry registry) {
        log.info("registry add properly");
        registry.addViewController("/").setViewName(ViewNames.HOME);
        registry.addViewController("/TrainingRequest").setViewName("TrainingRequest");
    }

【讨论】:

  • 你的意思是告诉我,我必须明确命名所有控制器的 url。有没有更好的方法在 addViewControllers 方法中注册 ViewNames 中的所有变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多