Sha*_*our 1 spring spring-mvc spring-data-rest
我想扩展RepositoryRestExceptionHandler以处理RestController中的错误。
我有验证器,并且在使用RestRepository时工作良好,但是当我使用RestController时,它们却不是,所以我做了如下所示的手动验证
Errors errors = new BeanPropertyBindingResult(NumberRange, "range");
NumberRangeValidator.validate(NumberRange, errors);
if(errors.hasErrors()) {
throw new RepositoryConstraintViolationException(errors);
}
Run Code Online (Sandbox Code Playgroud)
这导致错误500,我想要得到的结果与正文中列出的错误400错误请求相同。
我认为我应该扩展下面的类来处理来自我的剩余控制器的异常
@ControllerAdvice(basePackageClasses = RepositoryRestExceptionHandler.class)
public class RepositoryRestExceptionHandler { .... }
Run Code Online (Sandbox Code Playgroud)
我试图避免创建与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);
}
}
Run Code Online (Sandbox Code Playgroud)
有了这个ControllerAdvice,我会收到一个BAD_REQUEST 400-这样可以正常工作。
| 归档时间: |
|
| 查看次数: |
981 次 |
| 最近记录: |