Extend RepositoryRestExceptionHandler

时间:2015-12-04 09:35:58

标签: spring spring-mvc spring-data-rest

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

感谢

1 个答案:

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