在SpringBoot中使用@PathVariable的方法返回空响应

时间:2017-07-19 11:34:39

标签: spring-boot

我正在尝试编写一个带有@PathVariable参数并将用户重定向到jsp文件的方法。

@Controller
public class MainController 
{

    @RequestMapping("/user/{customerId}")
    // http://localhost:8080/Test/user/5
    public String getCustomerById(@PathVariable("customerId") String customerId, Model model) 
    {
            model.addAttribute("customer_id", customerId);
            // this is the user_details.jsp file, I need to show this jsp file to visitor
            return "user_details";
    }
}

当我尝试导航http://localhost:8080/SpringBlog/user/5它向我显示一个空洞的回复。 (甚至没有页面来源)

当我查看Spring输出控制台时,它在我尝试导航时向我显示以下消息:

  

2017-07-19 13:24:56.191 ERROR 6772 --- [io-8080-exec-75]

     

o.s.boot.web.support.ErrorPageFilter

     

无法转发请求[/ user / 5]的错误页面,因为响应已提交。因此,响应可能具有错误的状态代码。如果您的应用程序在WebSphere Application Server上运行,则可以通过将com.ibm.ws.webcontainer.invokeFlushAfterService设置为false来解决此问题

我已经尝试过以下参数说明:

  

@PathVariable(value =“customerId”)String customerId

     

@PathVariable(name =“customerId”)String customerId

     

@PathVariable(“customerId”)String customerId

     

@PathVariable String customerId

它们都没有工作,总是空响应,但错误信息相同。

我确信所有文件都在我的MainController类中的正确位置 我有几个方法,没有参数,RequestParams等。所有这些方法都按预期工作。但是如果我想用@PathVariable创建一个RequestMapping,它总是在输出控制台中返回空响应和相同的错误消息。

但是,如果我尝试使用@RestController的相同方法,它会按预期工作:

@RestController
public class RestApi
{
    // http://localhost:8080/Test/api/user/56
    // Is Working, Returns Hello 56 As Response
    @RequestMapping("api/user/{customerId}")
    public String apiTest(@PathVariable("customerId") String customerId)
    {
        return "Hello "+customerId; 
    }
}

我错过了什么?

申请详情:

<packaging>war</packaging>
...
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.4.RELEASE</version>
        <relativePath/>
        <!-- lookup parent from repository -->
</parent>
...

Apache Tomcat/7.0.56
JVM 1.8.0_131-b11

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

注释@RestController会自动将@ResponseBody添加到您的方法中。

@ResponseBody做的是使用HttpMessageConverter将传出的返回值绑定到HTTP响应正文。如果您不添加@RestController@ResponseBody注释,那么Spring将尝试将其解析为视图,通常是JSP页面。

因此,在您的情况下,Spring正在尝试查找视图匹配"Hello"+customerId,而不是打印出"Hello"+customerId的结果。

所以你正确使用@PathVariable注释。 :)

您可以阅读更多here

答案 1 :(得分:0)

如果您正在使用@Controller注释,则需要添加@ResponseBody注释以将传出的返回值绑定到HTTP响应正文。因此,@Controller的代码应如下所示:

@Controller
public class MainController 
{

    @RequestMapping("/user/{customerId}")
    @ResponseBody
    // http://localhost:8080/Test/user/5
    public ModelAndView getCustomerById(@PathVariable("customerId") String customerId, ModelAndView model) 
    {
            model.addAttribute("customer_id", customerId);
            // this is the user_details.jsp file, I need to show this jsp file to visitor
            model.setViewName("user_details");
            return model;
    }
}

答案 2 :(得分:0)

请检查您的application.properties文件......

前缀和后缀

spring.mvc.view.prefix: (Where are jsp files) Example /WEB-INF/ or / 
spring.mvc.view.suffix: .jsp