我想扩展RepositoryRestExceptionHandler以处理我的RestController中的错误。
我使用Validator并且在使用RestRepository时工作得很好但是当我使用RestController时他们不是这样我手动验证如下所示
Errors errors = new BeanPropertyBindingResult(NumberRange, "range");
NumberRangeValidator.validate(NumberRange, errors);
if(errors.hasErrors()) {
throw new RepositoryConstraintViolationException(errors);
}
这导致错误500,我想要的结果与400错误请求相同,并且正文中列出了错误。
我想我应该扩展下面的类以处理来自我的其余控制器的异常
@ControllerAdvice(basePackageClasses = RepositoryRestExceptionHandler.class)
public class RepositoryRestExceptionHandler { .... }
我试图避免创建与RepositoryRestExceptionHandler
完全相同的ControllerAdvice感谢
答案 0 :(得分:4)
RepositoryRestExceptionHandler仅限于来自其自己的包的控制器 - 这基本上意味着它只在调用spring数据休息控制器(RepositoryEntityController)时应用。
所以我只是尝试扩展RepositoryRestExceptionHandler并使用包含它应该应用于的控制器的包来注释你的子类:
@ControllerAdvice(basePackages="com.my.package")
这样你就不会改变spring数据休息的异常处理行为,并确保你只是增强了控制器方法的错误处理。
我刚试过这个 - 所以我的自定义控制器(注释为@RepositoryRestController
)包含一个抛出RepositoryConstraintViolationException
的方法。 spring数据休息异常处理程序RepositoryRestExceptionHandler
将此异常转换为BAD_REQUEST(400)。
但这不适用于我的自定义控制器方法 - 我得到一个INTERNAL_SERVER_ERROR(500)。
所以我扩展RepositoryRestExceptionHandler
并注释我的控制器建议,以便它只适用于我的控制器的包:
@ControllerAdvice(basePackageClasses = DefaultExceptionHandler.class)
public class DefaultExceptionHandler extends RepositoryRestExceptionHandler {
@Autowired
public DefaultExceptionHandler(MessageSource messageSource) {
super(messageSource);
}
}
使用此ControllerAdvice,我收到一个BAD_REQUEST 400 - 所以这可以按预期工作。