我想扩展RepositoryRestExceptionHandler以处理RestController中的错误。
我有验证器,并且在使用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
谢谢
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-这样可以正常工作。