我有一个简单的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
其他混乱的请求属性包括:strippedServletPath
,requestDispatcherPath
,requestUri
。为了简洁起见,我不会将它们放在答案体中
答案 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));
}