我一直在尝试编写自定义功能,其中REST端点使用纯文本。这是一段代码:
@RepositoryRestController
@RequestMapping("/api/samples")
public class SampleController {
@Autowired
SampleRepository sampleRepository;
@RequestMapping(value = "/{id}", method = RequestMethod.PUT, consumes = MediaType.TEXT_PLAIN_VALUE)
@ResponseBody
public void updateSample(@PathVariable Long id, @RequestBody String message ) {
//do some custom logic here
//sampleRepository.update(id);
}
}
Spring Data rest抛出异常HttpStatus.UNSUPPORTED_MEDIA_TYPE(415)
。但是,当我将代码移动到单独的Controller时:
@RestController
@RequestMapping("/api/samples")
public class SampleController {
@Autowired
SampleRepository sampleRepository;
@RequestMapping(value = "/{id}", method = RequestMethod.PUT,consumes =MediaType.TEXT_PLAIN_VALUE)
@ResponseBody
public void updateSample(@PathVariable Long id,@RequestBody String message ) {
//do some custom logic here
//sampleRepository.update(id);
}
}
这很好用。有任何人遇到类似问题,将代码移动到单独的方法可以解决问题(Work Around)。
关于如何解决问题的任何建议都很棒
答案 0 :(得分:0)
我在两个代码示例之间看到的唯一区别是在第一种情况下使用 @RepositoryRestController 而在第二种情况下使用 @RestController 。
当覆盖由Spring Data REST自动生成的端点时,例如 PUT / api / samples / {id} ,您应该在方法中使用 @RequestMapping 等级,因为暴露的原因here。
官方文档没有明确禁止类级请求映射,但只有example才使用方法级请求映射。
@RepositoryRestController
public class SampleController {
@Autowired
SampleRepository sampleRepository;
@RequestMapping(value = "/api/samples/{id}", method = RequestMethod.PUT, consumes = MediaType.TEXT_PLAIN_VALUE)
@ResponseBody
public void updateSample(@PathVariable Long id, @RequestBody String message ) {
//do some custom logic here
//sampleRepository.update(id);
}
}
如果在类级别同时使用 @RepositoryRestController 和 @RequestMapping ,则无法访问Spring Data Rest通常生成的所有端点处理程序。我猜您是在向 / api / samples / {id} 发送请求而未将内容类型设置为 text / plain ,因此实际上没有端点可以处理您的请求,因此出现错误消息。
有关seconde代码示例的注释: @ResponseBody 由 @RestController 隐含,因此无需使用它注释您的方法。