在 Spring 存储库查询方法中,是否可以强制要求存在/需要参数?

In a Spring Repository Query Method, is it possible to enforce presence / that a parameter be required?

即在 spring 存储库中的以下查询方法中,HTTP 请求不需要 a 和 b。是否可以在存储库级别强制存在这些参数?

我想明确说明我向客户公开的 API。现在没有参数,a、b、a&b 都被暴露的端点接受。但是我只想公开a&b。

List<Thing> findByBAndC(@Param(value="a") Long a,@Param(value="b") Long b);

不知道有什么 Spring 数据方法可以做到这一点,但我自然而然地想到了一些方法...

您可以使用自定义 @Query,仅当两者都存在时 ("is not null") 才会返回某些内容,如果足够的话

您也可以(ab)使用@PreAuthorize 的安全性来检查两个参数是否不为空,但这听起来很臭。

可能是我能想到的最简单(也是最不臭)的方法是编写自己的 Aspect 环绕方法并抛出两个参数都不存在的异常......例如,创建您自己的自定义注释,将其放在您的方法之前,然后编写一个方面,例如 (未测试):

@Around("@annotation(com.example.AllParametersRequired.class)")
public Object throwExceptionOnMissingParameters(ProceedingJoinPoint pjp) throws Throwable {
      int nullCount = Arrays.stream(pjp.getArgs()).filter( o -> o == null).count();
      if (nullCount > 0) throw new RuntimeException("Null is not allowed.);
      return pjp.proceed();
}

您可能需要在那里进行一些试验,看看哪个切入点最适合您的情况,但我不明白为什么您不能围绕 Spring 包装一个方面数据的存储库方法。不管怎样,这里有一个 link 到 Spring AOP 文档,如果你想这样做,它可能会有所帮助:Link