在spring-data-rest中使用验证器返回http 500而不是400

i2loujxw  于 2023-02-28  发布在  Spring
关注(0)|答案(3)|浏览(144)

我试图让spring-data-rest中的验证工作,从文档中你只需要提供一个验证器,我已经让它工作了,但是当一个验证约束被成功捕获/处理时,我得到了一个500错误页面和堆栈跟踪。
在配置类RepositoryRestMvcConfiguration中,它有一个validationExceptionHandler,看起来应该返回400而不是500这样的验证错误。它也是一个延迟加载的bean。
我的设置是否不正确?或者是否有其他方法可以让spring-data-rest返回400而不是500?
我使用的是spring-data-rest版本2.0.0发布
Tomcat返回的堆栈跟踪:

HTTP Status 500 - Request processing failed; nested exception is javax.validation.ConstraintViolationException: Validation failed for classes [test.domain.Account] during persist time for groups [javax.validation.groups.Default, ]

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is javax.validation.ConstraintViolationException: Validation failed for classes [test.domain.Account] during persist time for groups [javax.validation.groups.Default, ]
List of constraint violations:[
    ConstraintViolationImpl{interpolatedMessage='size must be between 0 and 10', propertyPath=login, rootBeanClass=class test.domain.Account, messageTemplate='{javax.validation.constraints.Size.message}'}
]
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:965)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:855)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

账户主体:

@Entity
public class Account {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Long id;

    @Column(unique = true)
    @Size(max = 10)
    String login;

}

剩余Mvc配置:

@Configuration
public class RestExporterRestConfig extends RepositoryRestMvcConfiguration {}
oxf4rvwz

oxf4rvwz1#

似乎已经得到了它的工作;我不得不重写validatingRepositoryEventListener()并手动添加验证器到侦听器;

@Configuration
public class RestExporterRestConfig extends RepositoryRestMvcConfiguration {

    @Bean
    public Validator validator() {
        return new LocalValidatorFactoryBean();
    }

    @Bean
    @Override
    public ValidatingRepositoryEventListener validatingRepositoryEventListener() {
        ValidatingRepositoryEventListener listener = new ValidatingRepositoryEventListener();
        configureValidatingRepositoryEventListener(listener);
        listener.addValidator("afterCreate", validator());
        listener.addValidator("beforeCreate", validator());
        return listener;
    }

}

我现在得到一个400返回如下;

400 Bad Request
{"errors":
    [{  "entity":"Account",
        "message":"size must be between 0 and 10",
        "invalidValue":"login 0dsfdsfdsfdsfdsfdsfdsfds",
        "property":"login"
    }]
}
pexxcrt2

pexxcrt22#

前面的答案对我不起作用,我想是由于Spring Data Rest的变化,所以这里有一个更新的答案,它确实与JPA和MongoDb一起工作,以保存其他人在这方面花费的时间。
必须将此添加到我的build.gradle依赖项中

compile('org.hibernate:hibernate-validator:4.2.0.Final')

和此配置类

@Configuration
public class CustomRepositoryRestConfigurerAdapter extends RepositoryRestConfigurerAdapter {

   @Bean
   public Validator validator() {
       return new LocalValidatorFactoryBean();
   }

   @Override
   public void configureValidatingRepositoryEventListener(ValidatingRepositoryEventListener validatingListener) {
       validatingListener.addValidator("afterCreate", validator());
       validatingListener.addValidator("beforeCreate", validator());
       validatingListener.addValidator("afterSave", validator());
       validatingListener.addValidator("beforeSave", validator());
   }
}
enxuqcxy

enxuqcxy3#

既然Java已经在接口上实现了默认方法,Spring已经弃用了Adapter类型。你可以实现Romell提供的解决方案,如下所示。就个人而言,我并不关心after方法,但你可以自由选择。

@Configuration
public class CustomRepositoryRestConfigurer implements RepositoryRestConfigurer {
    @Bean
    public Validator validator() {
        return new LocalValidatorFactoryBean();
    }
    @Override
    public void configureValidatingRepositoryEventListener(ValidatingRepositoryEventListener validatingListener) {
        validatingListener.addValidator("beforeCreate", validator());
        validatingListener.addValidator("beforeSave", validator());
    }
}

相关问题