尝试使用ControllerAdvice处理DataIntegrityViolationException,并使用Spring Boot 1.3.3返回自定义响应& Spring Data REST v 2.4.4。这里是我的课:使用Spring Data REST无法捕获DataIntegrityViolationException
ExceptionControllerAdvice.java
@ResponseStatus(HttpStatus.CONFLICT)
@ExceptionHandler(DataIntegrityViolationException.class)
public ViolationResponse handleConflictException(DataIntegrityViolationException ex) throws Exception {
return new ViolationResponse(ex.getMessage());
}
ViolationResponse.java
public class ViolationResponse {
private String message;
public ViolationResponse(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
我预计这将有消息返回409冲突HTTP状态代码
{“mes圣人 “:” ... “}
但我得到这个响应,而不是404种状态:
{ ”时间戳“:1463382639043 ”状态“:404 ”错误“:” “Not found” “exception”:“org.springframework.dao.DataIntegrityViolationException” “message”:“无法执行语句; SQL [n/a];约束[email_exists_constraint];嵌套的例外是org.hibernate.exception.ConstraintViolationException:无法执行语句” ‘路径’:‘/ API/V1 /注册’ }
缺少什么我在这里如何达到预期的效果?
编辑:
AuthController.java
@RestController
@RequestMapping("/api/v1")
public class AuthController {
...
@RequestMapping(value = "/register", method = RequestMethod.POST)
public User register(@Valid @RequestBody User user, BindingResult result) throws ValidationException {
if (result.hasErrors()) {
throw new ValidationException(result.getAllErrors());
}
return userRepository.save(user);
}
请向我们展示Controller的类声明和负责处理'/ api/v1/register'的方法签名。 – miensol
嗯,是''ExceptionControllerAdvice'用'@ ControllerAdvice'标记并在应用程序启动时创建的? – miensol
@miensol是的,'ExceptionControllerAdvice'是用'@ ControllerAdvice'注解的,并且按照我期望的另一种方法工作。该应用程序甚至可以在调试过程中看到'handleConflictException'方法内部的代码。但不是预期的响应,我得到了Spring Boot的默认响应。 – Polyakoff