执行请求处理程序,但响应状态始终为404

时间:2017-05-17 09:52:17

标签: java spring-mvc request http-status-code-404

我有一个简单的Web控制器来处理对GET /base/{userId}/test/{userId}的请求(例如GET /base/1/test/2)并返回一个稍后应该转换为JSON的对象。

@Controller
@RequestMapping("/base/{userId}")
public class TestController {

    @Autowired
    TestService testService;

    @GetMapping("/test/{testId}")
    Response<TestDto> getTest(@PathVariable("userId") Long userId, @PathVariable("testId") Long testId) {
        return Response.ok(testService.get(userId));
    }

}

但每当我打电话给它时,我得到了#34; 404 - 未找到&#34;作为回应。我已经调试了我的代码,并确保TestService服务和Response#ok()方法正常运行。

然后我调试了Spring Framework源代码,发现由于一些未知的奇怪原因,Spring的内部过滤器链执行了两次,请求URI在第二次执行时搞砸了(URI重复)。例如,关于我有request.servletPath = "/base/1/test/2"的第一次执行,在后续执行中我有request.servletPath = "/base/1/base/1/test/2" (*见下面的注释)。然后返回提到的404错误,因为显然我没有在我的应用程序中映射/base/1/base/1/test/2

出了什么问题,我该如何解决?

* request此处的类型为ApplicationHttpRequest    其他混乱的请求属性包括:strippedServletPathrequestDispatcherPathrequestUri。为了简洁起见,我不会将它们放在答案体中

1 个答案:

答案 0 :(得分:0)

您只是忘记在getTest()方法上添加@ResponseBody注释。

  

指示方法返回值的注释应绑定到Web响应主体。

此代码应该有效:

@GetMapping("/test/{testId}")
@ResponseBody
public Response<TestDto> getTest(@PathVariable("userId") Long userId, @PathVariable("testId") Long testId) {
    return Response.ok(testService.get(userId));
}