当前位置:  开发笔记 > 编程语言 > 正文

扩展RepositoryRestExceptionHandler

如何解决《扩展RepositoryRestExceptionHandler》经验,为你挑选了1个好方法。

我想扩展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

谢谢



1> Mathias Dpun..:

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-这样可以正常工作。

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有