Java Spring数据静态验证+;异常映射程序:混乱
我正在使用SpringDataREST,一切都很顺利 我想对我的实体应用验证(JSR303) spring文档说我可以用几种方式截获应用程序事件(我都无法使用,现在spring.io似乎已经关闭) 然而,我确实通过将 @验证 我的答复是:Java Spring数据静态验证+;异常映射程序:混乱,java,spring,spring-data-rest,Java,Spring,Spring Data Rest,我正在使用SpringDataREST,一切都很顺利 我想对我的实体应用验证(JSR303) spring文档说我可以用几种方式截获应用程序事件(我都无法使用,现在spring.io似乎已经关闭) 然而,我确实通过将 @验证 我的答复是: @Validated @RepositoryRestResource(collectionResourceRel = "workers", path = "workers") public interface WorkerRepository extends
@Validated
@RepositoryRestResource(collectionResourceRel = "workers", path = "workers")
public interface WorkerRepository extends PagingAndSortingRepository<Worker, Long> {
}
所以,简而言之,我想
- 使用JSR303验证实体
- 生成包含400:和映射或字段->错误的HTTP实体
Detected @ExceptionHandler methods in repositoryRestExceptionHandler
这似乎很有用。当我签出该类时,它看起来确实是我需要的一般来说,这将是一个痛苦的过程,您必须在hibernate约束冲突列表下进行完全控制。 MethodValidationPostProcessor可以帮助您触发@Validated接口/类的验证过程。 如果返回对象或参数是复杂类,则必须将其标记为@Valid 下一篇文章可以对您有所帮助:
不幸的是,我还没有发现像SpringWebMVC这样的数据绑定机制,它可以在一个地方报告转换/验证问题的错误(而且它看起来无法以某种方式重用)SpringDataREST没有自动应用bean验证。如果您想要bean验证,您需要在springdatarest中注册适当的验证器 以下配置为我提供了解决方案:
@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验证约束的实体都会在更新和创建之前进行验证
(这不是为SpringDataREST项目中的自定义控制器启用bean验证,但这不是您所要求的,是吗?)
- spring数据rest验证机制正在抛出一个
RepositoryConstraintViolationException
- 由
RepositoryRestExceptionHandler处理的
- 这导致错误被序列化为
RepositoryConstraintViolationExceptionMessage
400错误请求
,其主体如下:
{
"errors" : [ {
"entity" : "MyEntity",
"message" : "may not be null",
"invalidValue" : "null",
"property" : "price"
}, {
"entity" : "MyEntity",
"message" : "may not be empty",
"invalidValue" : "",
"property" : "name"
}
}
自定义控制器
您可以使用SpringDataREST实体生命周期利用SpringDataREST注册的验证器。e、 您可以在自定义控制器中发出一个消息来触发所有事件处理程序,以及SpringDataREST提供的验证事件侦听器。因此,您可以获得相同的错误和错误表示。这看起来可能有效,这正是我所需要的。但是我需要截获那些验证失败的情况。@ChristianBongiorno-谢谢你的提示-我在帖子中添加了更多的细节-配置就是你所需要的-其余的都已经在spring数据中提供了-rest@MathiasDpunkt回答得很好但事实上,对于spring data rest自定义控制器,您将如何实现类似的行为?@m4rtin我在帖子中添加了一段-这有帮助吗?@MathiasDpunkt它确实让我走上了正确的道路,非常感谢!还感谢您的快速回复:)
{
"errors" : [ {
"entity" : "MyEntity",
"message" : "may not be null",
"invalidValue" : "null",
"property" : "price"
}, {
"entity" : "MyEntity",
"message" : "may not be empty",
"invalidValue" : "",
"property" : "name"
}
}