我想在 Spring Data JDBC 存储库中添加一个自定义方法,该方法应该获取一个字符串作为参数,我想检查该字符串是否映射到枚举的值,如果不可能,则抛出异常。
这将是未经验证的自定义方法:
@Repository
public interface RunRepository extends ListCrudRepository<Run,Integer> {
@Query("SELECT * FROM Run WHERE location = :location")
List<Run> findAllByLocation(String location);
}
我的解决方案是 将自定义方法从 RunRepository 接口移动到新的 RunRepositoryCustom 接口,然后为其编写一个实现,在其中验证值,并在必要时使用 jdbcTemplate 服务执行查询。
虽然我的解决方案有效,但我最终添加了相当多的文件并编写了自己的自定义方法的实现。
有没有一种方法可以根据某些自定义代码验证自定义方法输入,同时使用 @Query 装饰器坚持声明性 Spring Data 方式?
换句话说,是否有一个注释可以让我为方法输入提供验证功能?
我应该将验证移至控制器并让存储库输出纯数据库查询结果吗?
换句话说,是否有一个注释可以让我为方法输入提供验证功能?
不,没有专门的注释来执行此操作。 但是您可以(ab)使用 SpEL 来实现此目的:创建一个方法,该方法将要验证的值作为输入,并在有效时返回原样,否则抛出异常并在查询的 SpEL 表达式中使用该方法。
我应该将验证移至控制器并让存储库输出纯数据库查询结果吗?
我认为这是一个很好且重要的问题。
验证不应该在持久层中完成。 相反,您应该验证您的输入并将其转换为强域对象,这些对象不能通过构造而具有无效状态。