2016-05-16 138 views
1

尝试使用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); 
} 
+1

请向我们展示Controller的类声明和负责处理'/ api/v1/register'的方法签名。 – miensol

+1

嗯,是''ExceptionControllerAdvice'用'@ ControllerAdvice'标记并在应用程序启动时创建的? – miensol

+0

@miensol是的,'ExceptionControllerAdvice'是用'@ ControllerAdvice'注解的,并且按照我期望的另一种方法工作。该应用程序甚至可以在调试过程中看到'handleConflictException'方法内部的代码。但不是预期的响应,我得到了Spring Boot的默认响应。 – Polyakoff

回答

1

使用@ResponseBody在ExceptionControllerAdvice.java中注释您的方法handleConflictException。这将告诉spring从你的返回对象中创建一个JSON。 @RestController里面有@ResponseBody,@ControllerAdvice没有。

相关问题