Spring 数据剩余验证 + 异常映射器:令人困惑
Spring data rest validation + exception mapper: confusing
我正在使用 Spring Data Rest,一切顺利。
我想对我的实体应用验证 (JSR 303)。
spring 文档说我可以通过几种方式拦截应用程序事件(none 我可以开始工作,现在 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 时,它看起来确实是我需要的
总的来说这会很痛苦,您必须在休眠状态下完全控制违反约束的列表。
MethodValidationPostProcessor 可以帮助您触发@Validated interfaces/classes 的验证过程。
如果您的 return 对象或参数是复杂的 class,则它也必须标记为 @Valid。
下篇文章可以帮到你一点点:
https://dzone.com/articles/method-validation-spring-31
不幸的是,我没有发现任何类似 spring-webmvc 的数据绑定机制,该机制在一个地方报告带有 conversion/validation 问题的错误(并且它看起来无法以某种方式重用)
Spring 剩余数据未自动应用 bean 验证。如果你想要 bean 验证,你需要在 spring data rest.
中注册合适的验证器
以下配置对我有用:
@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 项目中的自定义控制器启用 bean 验证 - 但这不是您所要求的 - 是吗?)
- spring 数据剩余验证机制抛出
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"
}
}
自定义控制器
您可以在自定义控制器中使用 spring-data-rest 实体生命周期 application events. e.g. you can emit a BeforeSaveEvent 利用 spring-data-rest 注册验证器来触发所有事件处理程序,并且spring-data-rest 提供的验证事件侦听器。因此,您可以获得相同的错误和错误表示。
我正在使用 Spring Data Rest,一切顺利。
我想对我的实体应用验证 (JSR 303)。
spring 文档说我可以通过几种方式拦截应用程序事件(none 我可以开始工作,现在 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 时,它看起来确实是我需要的
总的来说这会很痛苦,您必须在休眠状态下完全控制违反约束的列表。 MethodValidationPostProcessor 可以帮助您触发@Validated interfaces/classes 的验证过程。 如果您的 return 对象或参数是复杂的 class,则它也必须标记为 @Valid。
下篇文章可以帮到你一点点: https://dzone.com/articles/method-validation-spring-31
不幸的是,我没有发现任何类似 spring-webmvc 的数据绑定机制,该机制在一个地方报告带有 conversion/validation 问题的错误(并且它看起来无法以某种方式重用)
Spring 剩余数据未自动应用 bean 验证。如果你想要 bean 验证,你需要在 spring data rest.
中注册合适的验证器以下配置对我有用:
@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 项目中的自定义控制器启用 bean 验证 - 但这不是您所要求的 - 是吗?)
- spring 数据剩余验证机制抛出
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"
}
}
自定义控制器
您可以在自定义控制器中使用 spring-data-rest 实体生命周期 application events. e.g. you can emit a BeforeSaveEvent 利用 spring-data-rest 注册验证器来触发所有事件处理程序,并且spring-data-rest 提供的验证事件侦听器。因此,您可以获得相同的错误和错误表示。