有没有办法在spring-data-rest存储库方法上验证方法参数?

时间:2018-10-21 10:11:11

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

例如,我有一个类似的存储库类。

@RepositoryRestResource
public interface FooRepository extends JpaRepository<Foo, Integer> {

  Optional<Foo> findByBarId(@Param("barId") Integer barId);

}

这将生成路径为http://hostname/foo/search/findByBarId{?fooId}的搜索端点

当我不带任何参数访问该URL时,我得到一个404,我认为可以。

但是,我宁愿为此类型发送400或错误消息,因为我的业务肯定需要此API的参数。

我尝试使用@javax.validation.constraints.NotNull

Optional<Foo> findByBarId(@Param("barId") @NotNull Integer barId);

以及@org.springframework.lang.NonNull

Optional<Foo> findByBarId(@Param("barId") @NonNull Integer barId);

两个注释均无效。当然,这是行不通的,因为这些注释本身只是元信息,而Spring框架并未考虑这些信息。

文档中没有显示任何有关参数验证行为的内容。 (他们只谈论实体生命周期validation

是否有任何简单的方法可以实现这种行为?

如果有帮助,我使用spring-boot 2.0.4。

1 个答案:

答案 0 :(得分:-1)

您可以编写 RepositoryRestController 来运行特定业务以自定义端点。

这是您的案例的一个示例,您也可以自定义它:

@RepositoryRestController
public class FooController {

    FooRepository fooRepository;

    @Autowired
    public FooController(FooRepository fooRepository) {
        this.fooRepository = fooRepository;
    }

    @GetMapping(path = "/foo")
    public ResponseEntity getfoo(@RequestParam("barId") Optional<Integer> barId) {
        if (!barId.isPresent()) {
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
        }

        Optional<Foo> foo = fooRepository.findByBarId(barId.get());

        return ResponseEntity.ok(foo);
    }
}