Java 防止在Spring Boot中注册请求映射
在我的应用程序中,我有一个抽象控制器,它已经可以处理常见的CRUD行为,并且可以为某些实体实例化Java 防止在Spring Boot中注册请求映射,java,spring,spring-boot,Java,Spring,Spring Boot,在我的应用程序中,我有一个抽象控制器,它已经可以处理常见的CRUD行为,并且可以为某些实体实例化 @RestController 公共抽象类DefaultRestController{ @GetMapping @NotNull 公共页面findAll(@NotNull final Pageable Pageable){ 返回服务.getAll(可分页); } //这里有更多的积垢方法 } 现在,当我重写这个控制器时,我可能希望保留大多数方法,但是在保留请求映射的同时自定义一些方法。例如,假设我
@RestController
公共抽象类DefaultRestController{
@GetMapping
@NotNull
公共页面findAll(@NotNull final Pageable Pageable){
返回服务.getAll(可分页);
}
//这里有更多的积垢方法
}
现在,当我重写这个控制器时,我可能希望保留大多数方法,但是在保留请求映射的同时自定义一些方法。例如,假设我想要一个扩展上述抽象类的UserController
,我仍然想要一个GET/
映射,但是,方法签名应该改变。例如,我想要这个:
@RestController
@请求映射(“/user”)
公共类UserController扩展了DefaultRestController{
@GetMapping
公共页面findAllFiltered(@NotNull final Pageable Pageable,规范规范){
// ...
}
}
这是无效的,因为现在我有两个处理程序用于相同的映射(GET/
)。我现在要做的是重写findAll()
方法,并使用自定义注释(如@IgnoreRequestMapping
)对其进行注释以禁用它
我首先尝试了描述的方法。但是,只有当我想完全禁用映射,而不是“覆盖”它时,这才有效
此外,我还尝试创建一个自定义版本的RequestMappingHandlerMapping
并以实际registerhandler方法()的方式重写registerhandler方法(对象处理程序、方法方法、RequestMappingInfo映射)
只有当方法上不存在@IgnoreRequestMapping
时才会调用,但这也不起作用
我不太熟悉Spring的内部结构。有人能帮我实现我想要的行为吗?好吧,你只想扩展父类的一部分-Java不允许这样做。您可以重写原始方法并为其使用不同的路径,但必须实现它
@RestController
@RequestMapping("/user")
public class UserController extends DefaultRestController<UserDTO, User> {
@GetMapping("/unfiltered")
@NotNull
public Page<U> findAll(@NotNull final Pageable pageable) {
throw new RuntimeException("not implemented");
}
@GetMapping
public Page<User> findAllFiltered(@NotNull final Pageable pageable, Specification spec) {
// ...
}
}
@RestController
@请求映射(“/user”)
公共类UserController扩展了DefaultRestController{
@GetMapping(“/未筛选”)
@NotNull
公共页面findAll(@NotNull final Pageable Pageable){
抛出新的RuntimeException(“未实现”);
}
@GetMapping
公共页面findAllFiltered(@NotNull final Pageable Pageable,规范规范){
// ...
}
}
当然,这有点老套(因为没有像@NoMapping
这样的东西,所以你应该为你的过滤方法使用一个不同的路径——或者不要扩展你的DefaultRestController
谢谢,这也是我的想法,但是正如你所说的,给映射一些“随机”的方法名字很黑,特别是因为它仍然会被列在斯威格文档中,等等。难道没有办法创建这样的注释吗?我不这么认为。你至少可以用@apignore
对斯威格隐藏一个方法。当然,最好的方法是实现这两个方法。