在Spring Repository Query Method中,是否可以强制存在/需要参数?

时间:2016-05-05 11:45:11

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

即。在Spring存储库中跟随查询方法时,HTTP请求中既不需要也不需要b。是否可以在存储库级别强制执行这些参数?

我想明确我向客户端公开的API。现在没有params,a,b,a& b都被暴露的端点接受。但是我只想曝光一个& b。

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

1 个答案:

答案 0 :(得分:1)

不知道有任何Spring Data方法可以做到这一点,但我可以想到一些方法......

您可以使用自定义@Query,只有当两者都存在时(“不为空”)才会返回某些内容,如果这足够

你也可以(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 Data的存储库方法包装方面。无论如何,这里有一个Spring AOP文档的链接,如果你想这样做可能会有所帮助:Link