如何解决Spring Data REST:覆盖控制器上的存储库方法
有没有一种方法可以覆盖REST方法,同时又保留其他自动生成的Spring方法?
仔细看一下文档中的示例:虽然没有明确禁止类级请求映射,但它使用了方法级请求映射。我不知道这是否是想要的行为或错误,但据我所知,这是使其工作,如规定的唯一途径这里。
只需将你的控制器更改为:
@RepositoryRestController
public class FooController {
@Autowired
FooService fooService;
@RequestMapping(value = "/foo/{fooId}", method = RequestMethod.PUT)
public void updateFoo(@PathVariable Long fooId) {
fooService.updateProperly(fooId);
}
// edited after Sergey's comment
@RequestMapping(value = "/foo/{fooId}", method = RequestMethod.PUT)
public RequestEntity<Void> updateFoo(@PathVariable Long fooId) {
fooService.updateProperly(fooId);
return ResponseEntity.ok().build(); // simplest use of a ResponseEntity
}
}
解决方法
我有以下REST信息库,其实现是在运行时由Spring生成的。
@RepositoryRestResource
public interface FooRepository extends CrudRepository<Foo,Long> {
}
这意味着我将具有save(),find(),exist()和其他可用的方法,并通过REST公开。
现在,我想重写其中一种方法。例如,save()。为此,我将创建一个暴露该方法的控制器,如下所示:
@RepositoryRestController
@RequestMapping("/foo")
public class FooController {
@Autowired
FooService fooService;
@RequestMapping(value = "/{fooId}",method = RequestMethod.PUT)
public void updateFoo(@PathVariable Long fooId) {
fooService.updateProperly(fooId);
}
}
问题: 如果启用此控制器,则不再公开由Spring实现的所有其他方法。因此,例如,我无法再对/ foo / 1进行GET请求
问题: 有没有一种方法可以覆盖REST方法,同时又保留其他自动生成的Spring方法?
额外信息:
-
这个问题似乎非常相似: Spring Data Rest:具有相同request-mapping-path的RestController中的Override方法 …但是我不想将路径更改为/ foo / 1 / save之类的东西
-
我曾考虑使用@RepositoryEventHandler,但我不太喜欢这个主意,因为我想将其封装在服务下。另外,你似乎失去了对事务上下文的控制。
-
Spring Data文档的这一部分说明以下内容:
有时你可能想为特定资源编写自定义处理程序。要利用Spring Data REST的设置,消息转换器,异常处理等功能,请使用@RepositoryRestController批注,而不是标准的Spring MVC @Controller或@RestController
因此看来它应该是开箱即用的,但不幸的是不是。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。