我试图让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 {}
3条答案
按热度按时间oxf4rvwz1#
似乎已经得到了它的工作;我不得不重写validatingRepositoryEventListener()并手动添加验证器到侦听器;
我现在得到一个400返回如下;
pexxcrt22#
前面的答案对我不起作用,我想是由于Spring Data Rest的变化,所以这里有一个更新的答案,它确实与JPA和MongoDb一起工作,以保存其他人在这方面花费的时间。
必须将此添加到我的build.gradle依赖项中
和此配置类
enxuqcxy3#
既然Java已经在接口上实现了默认方法,Spring已经弃用了Adapter类型。你可以实现Romell提供的解决方案,如下所示。就个人而言,我并不关心after方法,但你可以自由选择。