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

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

即在 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 Data 方法可以做到这一点,但我自然而然地可以想到一些方法......

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

关于java - 在 Spring 存储库查询方法中,是否可以强制存在/需要参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37049767/

相关文章:

java - Android自动SQL插入

java - 为什么在小程序中按下按钮时会错误地按下变量的值?

java - Google Protobuf ByteString 与 Byte[]

eclipse - SpringSource Tool Suite (STS) 通过更新站点安装到现有 Eclipse 安装中不起作用

java - 如何通过用户输入显示JOptionPane

java - 无法解决匹配的构造函数 - 重写 BaseRepository 类

java - 在特定时间执行java代码

java - Neo4j 的 Spring Date 存储库和 "isEmpty"查询抛出 "IllegalArgumentException"

java - 使用 Spring 将 DataSource 与 Transaction 结合使用

java - Spring 数据 : How to store enum list in mySQL database