Spring Data Rest Custom Controller with content-Type:" text / plain"

时间:2016-06-06 21:18:32

标签: java content-type spring-data-rest

我一直在尝试编写自定义功能,其中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)。

关于如何解决问题的任何建议都很棒

1 个答案:

答案 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 隐含,因此无需使用它注释您的方法。