我有以下控制器建议来全局处理我的应用程序中的异常:
@ControllerAdvice
public class ExceptionHandlingController {
// Convert a predefined exception to an HTTP Status code
@ResponseStatus(value=HttpStatus.BAD_REQUEST) // 400
@ExceptionHandler(ConstraintViolationException.class)
public void ConstraintViolationExceptionHandler() {
//Nothing to do
}
}
下面的代码是控制器,它试图将对象保存到db(在服务层中)。对象所属的类具有失败的注释。
@RequestMapping(value = "/signup", method = RequestMethod.POST)
public void create(@RequestBody CustomUserDetails user, HttpServletResponse response) {
logger.debug("User signup attempt with username: " + username);
userDetailsServices.saveIfNotExists(user);
}
我希望客户端在抛出ConstraintViolationException时收到400响应。
当方法返回void
时,不返回任何响应。当我更改String
并返回随机文本时,我会收到404回复。
{
"timestamp": 1495489172770,
"status": 404,
"error": "Not Found",
"exception": "javax.validation.ConstraintViolationException",
"message": "Validation failed for classes [security.model.CustomUserDetails] during persist time for groups [javax.validation.groups.Default, ]\nList of constraint violations:[\n\tConstraintViolationImpl{interpolatedMessage='must match \"^(?!.*\\..*\\..*)[A-Za-z]([A-Za-z0-9.]*[A-Za-z0-9]){8,15}$\"', propertyPath=username, rootBeanClass=class com.boot.cut_costs.security.model.CustomUserDetails, messageTemplate='{javax.validation.constraints.Pattern.message}'}\n]",
"path": "/signup"
}
如何为此返回一个简单的BAD REQUEST消息,因为它是为@ExceptionHandler
定义的。
注意:ConstraintViolationExceptionHandler
被击中了!