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

Spring Boot MVC配置请求再次重定向到Dispatcher

陈扬
2023-03-14

我正在努力解决这里描述的问题

找不到URI为Spring MVC的HTTP请求的映射

问题是,一旦资源解析器解析了视图,它就会再次重定向到Dispatcher,而Dispatcher找不到映射到它的a方法。

例如,如果用户请求/test,解析器将其映射到/views/test。jsp,dispatcher没有呈现响应,而是尝试查找路径/views/test。jsp

我已经尝试将默认的dispatcher servlet路径更改为/(默认情况下是/)。

它不适用于Spring Boot配置。

我想知道是否有一种解决方案,无需将dispatcher path设置为除/以外的其他内容,比如/page

以下是产生问题的测试代码。(这里是测试项目的github链接https://github.com/ConsciousObserver/stackoverflow/tree/master/TestMvc)

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.embedded.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.DispatcherServlet;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@SpringBootApplication
public class TestMvcApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestMvcApplication.class, args);
    }
}

@Configuration
class MvcConfig extends WebMvcConfigurerAdapter {
    public MvcConfig () {
        System.out.println("%%%%%%%%%%%%% " + getClass() + " loaded %%%%%%%%%%%%%%%");
    }

    @Bean
    public ServletRegistrationBean dispatcherRegistration(DispatcherServlet dispatcherServlet) {
        ServletRegistrationBean registration = new ServletRegistrationBean(
                dispatcherServlet);
        System.out.println("%%%%%%%%%%%%%%%%% Adding dispatcher servletmapping");
        registration.addUrlMappings("/");
        return registration;
    }
}

@Controller
class TestController {
    @RequestMapping("test")
    public String test() {
        return "test";
    }
}

应用属性

logging.level.org.springframework.web=DEBUG

spring.mvc.view.prefix: /views/
spring.mvc.view.suffix: .jsp

以下是相关日志

Returning [org.springframework.web.servlet.view.InternalResourceView: name 'test'; URL [/views/test.jsp]] based on requested media type 'text/html'
Rendering view [org.springframework.web.servlet.view.InternalResourceView: name 'test'; URL [/views/test.jsp]] in DispatcherServlet with name 'dispatcherServlet'
Forwarding to resource [/views/test.jsp] in InternalResourceView 'test'
DispatcherServlet with name 'dispatcherServlet' processing GET request for [/views/test.jsp]
Looking up handler method for path /views/test.jsp
Did not find handler method for [/views/test.jsp]
Matching patterns for request [/views/test.jsp] are [/**]
URI Template variables for request [/views/test.jsp] are {}
Mapping [/views/test.jsp] to HandlerExecutionChain with handler [ResourceHttpRequestHandler [locations=[ServletContext resource [/], class path resource [META-INF/resources/], class path resource [resources/], class path resource [static/], class path resource [public/]], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@21362712]]] and 1 interceptor
Last-Modified value for [/views/test.jsp] is: -1
Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling
Successfully completed request
Successfully completed request

共有2个答案

狄元魁
2023-03-14

对于尝试其他解决方案却没有成功的人,您可能需要检查控制器类中是否存在ResponseBody注释。

@Controller
@EnableWebMvc
public class MainController {

    @Autowired
    BO bo = new BO();

    @RequestMapping(value = "/sayHello",
                    method = RequestMethod.GET, 
                    produces = "application/json")
    public @ResponseBody String sayHello() {
        return "Hellaa!!";
    }

}
洪高阳
2023-03-14

我终于找到了解决办法。

包含以下依赖项可以解决这个问题。

<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
</dependency>

我猜内部有一个JSP解析错误(或者JSTLView不存在),它将视图请求重定向到调度程序。

包含这些依赖项后,JSP视图将成功呈现。

 类似资料:
  • 我正在尝试使用重定向规则设置静态web托管。在我的应用程序中,任何具有前缀api/(http://web.company.com/api)的请求都应该重定向到具有相同前缀(http://api.company.com/api)的另一个主机。我已按以下方式设置路由规则: 但请求没有被正确重定向。控制台中有两个不同的错误: XMLHttpRequest无法加载http://api.company.co

  • 问题内容: 我有一个同时侦听HTTP和HTTPS的Spring Security版本3.2.3应用程序。我希望对HTTP端口的任何请求都重定向到HTTPS。如何仅使用Java进行配置? Spring Security javadoc for提出了以下解决方案(针对基本要求): 但是,这不起作用,因为没有方法。 问题答案: 更换用在问题的代码似乎得到期望的行为。然后,工作代码如下所示:

  • 我试图点击一个postendpoint,但它给出了错误302,当我在同一台服务器上尝试另一个get Url时,它给出了200。然后,我使用laxrirectstrategy()重定向了post请求。post请求正在重定向到get请求(只有同一个endpoint的方法名是get和post),它没有从post方法获得响应。有人能告诉我如何使用apahce httpClient 4.5将post请求重定

  • 我将spring saml扩展与Apache2.2+Tomcat7.0+OKTA(IdP)一起使用。securitycontext.xml如下所示: MetadataGeneratorFilter: 谢谢 奈良 HTTP请求转储:

  • 问题内容: 我想使用jQuery来获取URL,并明确检查它是否响应302重定向,但 不 遵循重定向。 jQuery 似乎总是遵循重定向。如何防止这种情况,并且不遵循重定向就可以看到重定向? 标题有很多问题,例如“ jquery ajax redirect”,但它们似乎都涉及实现其他目标,而不仅仅是直接检查服务器给出的状态。 问题答案: AJAX请求永远不会有机会不遵循重定向(即,它必须遵循重定向)

  • 我们的整个网站将通过https提供服务。我在每条路线上都有“https”。但是,如果他们试图通过http将其重定向到https,我该如何将其重定向到https?