扩展 RepositoryRestExceptionHandler

Extend RepositoryRestExceptionHandler

我想扩展 RepositoryRestExceptionHandler 来处理我的 RestController 中的错误。

我有验证器并且在使用 RestRepository 时工作得很好但是当我使用 RestController 时它们不是所以我做了如下手动验证

Errors errors = new BeanPropertyBindingResult(NumberRange, "range");
    NumberRangeValidator.validate(NumberRange, errors);

    if(errors.hasErrors()) {
         throw new RepositoryConstraintViolationException(errors);
    }

这会导致错误 500,我想要的结果与 400 错误请求相同,但正文中列出了错误。

我想我应该扩展下面的 class 来处理来自我的休息控制器的异常

@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 - 所以这按预期工作。