【发布时间】:2020-05-13 16:02:44
【问题描述】:
我正在使用@RepositoryRestResource 来创建我的REST API,这避免了像@RestController 中那样手动编写代码,并且给了我一个很好的HATEOAS 响应。但是现在我添加到我的实体的验证不起作用,或者我得到的是 500 响应代码而不是 400。
我尝试使用@ControllerAdvice + @ExceptionHandler 来捕获ConstraintViolationException,但它似乎之前被捕获并且抛出的是TransactionSystemException。
验证数据是非常基本的事情,但由于某种原因,经过多次谷歌搜索后,我还没有找到解决方案。
编辑:显示代码:
@ControllerAdvice
public class ConstraintViolationExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler({ ConstraintViolationException.class })
public ResponseEntity<Object> handleConstraintViolationException(
Exception ex, WebRequest request) {
return new ResponseEntity<Object>("test 123", HttpStatus.BAD_REQUEST);
}
}
我仍然得到:
Servlet.service() 用于 servlet [dispatcherServlet] 在上下文中的路径 [] 抛出异常 [请求处理失败;嵌套异常是 org.springframework.transaction.TransactionSystemException:不能 提交 JPA 事务;嵌套异常是 javax.persistence.RollbackException:提交时出错 交易]有根本原因 javax.validation.ConstraintViolationException
因此,Spring Data REST 似乎更早地捕获了 ConstraintViolationException,并引发了 TransactionSystemException。如果我更改代码以捕获此异常,例如:
@ControllerAdvice
public class ConstraintViolationExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler({ TransactionSystemException .class })
public ResponseEntity<Object> handleConstraintViolationException(
Exception ex, WebRequest request) {
return new ResponseEntity<Object>("test 123", HttpStatus.BAD_REQUEST);
}
}
然后它可以工作,但这不是我应该捕获的例外。
【问题讨论】:
-
嗨 Kaladin,需要查看您的代码,据我了解,您使用 excpetion 处理程序做得很好......我能想到的唯一场景......您必须在某处处理 ConstraintViolationException 或其父级你的代码
-
嗨 Swarit Agarwal,我更新了问题。 Spring Data REST 似乎正在捕获和转换异常。
标签: spring spring-boot validation