【发布时间】:2014-03-28 14:13:36
【问题描述】:
我正在尝试让 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;
}
RestMvcConfig:
@Configuration
public class RestExporterRestConfig extends RepositoryRestMvcConfiguration {}
【问题讨论】:
-
它应该返回 400,因为它来自客户端的错误请求。您可以使用 response.setStatus(400); 来设置状态;
-
是的,我同意它应该返回 400,我提出的问题是我认为 spring-data-rest 没有通过返回 400 来正确处理这些验证错误,所以我认为我错过了配置或validationExceptionHandler bean中的某些内容没有被加载或使用。
-
由于服务器端的异常,您将获得 500(这是非常合适的)。此外,您应该处理此异常并手动将状态码设置为 400。
-
这就是为什么我认为 RepositoryRestMvcConfiguration 中的 validationExceptionHandler 应该在做的原因,原因是 javax.validation.ConstraintViolationException 类型,它应该把它变成 400。所以要么是 bean未加载或从未使用过。我将尝试将 tomcat 设置为调试模式,看看该 bean 是否真的被初始化了。
标签: spring spring-mvc spring-data-rest