Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 防止在Spring Boot中注册请求映射_Java_Spring_Spring Boot - Fatal编程技术网

Java 防止在Spring Boot中注册请求映射

Java 防止在Spring Boot中注册请求映射,java,spring,spring-boot,Java,Spring,Spring Boot,在我的应用程序中,我有一个抽象控制器,它已经可以处理常见的CRUD行为,并且可以为某些实体实例化 @RestController 公共抽象类DefaultRestController{ @GetMapping @NotNull 公共页面findAll(@NotNull final Pageable Pageable){ 返回服务.getAll(可分页); } //这里有更多的积垢方法 } 现在,当我重写这个控制器时,我可能希望保留大多数方法,但是在保留请求映射的同时自定义一些方法。例如,假设我

在我的应用程序中,我有一个抽象控制器,它已经可以处理常见的CRUD行为,并且可以为某些实体实例化

@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
对斯威格隐藏一个方法。当然,最好的方法是实现这两个方法。