Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring数据静态验证+;异常映射程序:混乱_Java_Spring_Spring Data Rest - Fatal编程技术网

Java Spring数据静态验证+;异常映射程序:混乱

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

我正在使用SpringDataREST,一切都很顺利

我想对我的实体应用验证(JSR303)

spring文档说我可以用几种方式截获应用程序事件(我都无法使用,现在spring.io似乎已经关闭)

然而,我确实通过将

@验证

我的答复是:

@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"
  }
}