即。在Spring存储库中跟随查询方法时,HTTP请求中既不需要也不需要b。是否可以在存储库级别强制执行这些参数?
我想明确我向客户端公开的API。现在没有params,a,b,a& b都被暴露的端点接受。但是我只想曝光一个& b。
List<Thing> findByBAndC(@Param(value="a") Long a,@Param(value="b") Long b);
答案 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