我正在尝试编写一个带有@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
感谢您的帮助。
答案 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