gpt4 book ai didi

java - Spring 数据休息验证 + 异常映射器 : confusing

转载 作者:行者123 更新时间:2023-11-30 08:03:08 26 4
gpt4 key购买 nike

我正在使用 Spring Data Rest,一切顺利。

我想对我的实体应用验证 (JSR 303)。

spring 文档说我可以通过几种方式拦截应用程序事件(我无法开始工作,现在 spring.io 似乎已关闭)。

但是,我确实通过放置让它工作了

@验证

在我的仓库上:

@Validated
@RepositoryRestResource(collectionResourceRel = "workers", path = "workers")
public interface WorkerRepository extends PagingAndSortingRepository<Worker, Long> {

}

它会抛出一个异常。问题是它是一个 spring 异常,甚至不是根异常,我基本上需要进行验证并将它们转换为自定义实体有效负载:

{
"foo": "must be of length 10",
"baz": "Must match pattern '[A-Z]+'"
}

所以,简而言之,我想

  • 使用 JSR 303 验证实体
  • 生成带有 400: 和映射或字段 -> 错误的 HTTP 实体

最直接的方法是什么?我也偶然发现了这个:

Detected @ExceptionHandler methods in repositoryRestExceptionHandler

这似乎很有用。当我检查那个类(class)时,它看起来确实是我需要的

最佳答案

Spring data rest 不会自动应用 bean 验证。如果你想要 bean 验证,你需要在 spring data rest 中注册适当的 validator 。

以下配置对我有用:

@Configuration
public class MyValidationConfiguration extends RepositoryRestConfigurerAdapter {

@Bean
@Primary
/**
* Create a validator to use in bean validation - primary to be able to autowire without qualifier
*/
Validator validator() {
return new LocalValidatorFactoryBean();
}

@Override
public void configureValidatingRepositoryEventListener(ValidatingRepositoryEventListener validatingListener) {
Validator validator = validator();
//bean validation always before save and create
validatingListener.addValidator("beforeCreate", validator);
validatingListener.addValidator("beforeSave", validator);
}
}

使用此配置,每个具有 bean 验证约束的实体都会在更新和创建之前进行验证。

(这不是在 spring-data-rest 项目中为自定义 Controller 启用 bean 验证 - 但这不是您所要求的 - 是吗?)

  • spring data rest 验证机制抛出一个RepositoryConstraintViolationException
  • RepositoryRestExceptionHandler 处理
  • 导致错误被序列化为 RepositoryConstraintViolationExceptionMessage

因此验证错误响应将导致 400 Bad Request 正文如下:

{
"errors" : [ {
"entity" : "MyEntity",
"message" : "may not be null",
"invalidValue" : "null",
"property" : "price"
}, {
"entity" : "MyEntity",
"message" : "may not be empty",
"invalidValue" : "",
"property" : "name"
}
}

自定义 Controller

您可以使用 spring-data-rest 实体生命周期来利用您的 spring-data-rest 注册 validator application events .例如你可以发出 BeforeSaveEvent在您的自定义 Controller 中触发所有事件处理程序以及 spring-data-rest 提供的验证事件监听器。因此,您可以获得相同的错误和错误表示。

关于java - Spring 数据休息验证 + 异常映射器 : confusing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36437823/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com