Java 请求范围Bean的Bean创建错误
当Springbean被注释为Java 请求范围Bean的Bean创建错误,java,spring,rest,spring-boot,spring-mvc,Java,Spring,Rest,Spring Boot,Spring Mvc,当Springbean被注释为SCOPE\u REQUEST时,每当servlet接收到HTTP请求时,就会创建并销毁它。如果这个bean创建失败,服务器错误将发送回调用方 在这个简单的示例中,MyInputsbean的创建取决于HTTP请求的内容 @配置 类应用程序配置{ @豆子 @作用域(scopeName=WebApplicationContext.Scope\u请求,proxyMode=ScopedProxyMode.TARGET\u类) 公共MyInputs MyInputs(Http
SCOPE\u REQUEST
时,每当servlet接收到HTTP请求时,就会创建并销毁它。如果这个bean创建失败,服务器错误将发送回调用方
在这个简单的示例中,MyInputs
bean的创建取决于HTTP请求的内容
@配置
类应用程序配置{
@豆子
@作用域(scopeName=WebApplicationContext.Scope\u请求,proxyMode=ScopedProxyMode.TARGET\u类)
公共MyInputs MyInputs(HttpServletRequest请求){
字符串header1=request.getHeader(“header1”);
if(header1==null){
抛出新的MyException(“header1缺失”);
}
返回新的MyInputs(标题1);
}
}
如果HTTP请求不包含所需的头,将抛出BeanCreationException
。这会转化为一个毫无帮助的“500内部服务器错误”响应
我想返回一个更为用户友好的响应代码和正文,例如,一个带有有用消息的“400错误请求”。如何自定义此响应翻译?我找不到任何生命周期挂钩允许这样做
注意:这是使用请求范围bean的方式:
@RestController
公共类MyController{
私人最终提供者myInputsProvider;
@自动连线
公共MyController(提供程序myInputsProvider){
this.myInputsProvider=myInputsProvider;
}
@GetMapping(“/do stuff”)
公共空间{
//获取当前请求的输入
MyInputs MyInputs=myInputsProvider.get();
// ...
}
}
您可以使用@ControllerAdvice
注释来处理抛出后的异常
您还需要使用@ExceptionHandler
来处理异常
@Order(Ordered.HIGHEST_PRECEDENCE)
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MyException.class)
public final ResponseEntity<CustomError> handleException(MyException ex, WebRequest request) {
CustomError error = new CustomError();
error.setMessage(ex.getMessage());
error.setStatus(HttpStatus.BAD_REQUEST);
return new ResponseEntity<>(error, null, HttpStatus.BAD_REQUEST);
}
}
@顺序(有序。最高优先级)
@控制器建议
公共类GlobalExceptionHandler{
@ExceptionHandler(MyException.class)
公共最终响应权限句柄异常(MyException ex,WebRequest){
CustomError error=新的CustomError();
错误。setMessage(例如getMessage());
错误.setStatus(HttpStatus.BAD_请求);
返回新的ResponseEntity(错误、空、HttpStatus.BAD_请求);
}
}
只需用responsestatus注释您的异常,如下所示:@beatrice我确实尝试过。。问题是Spring将所有内容包装成一个BeanCreationException
,因此通常的处理程序不会被触发。请说明您如何尝试在请求处理程序中使用MyInputs
bean。在检查是否存在引发异常的MyInput.setHeader
后,可以使用一个调用MyInput.setHeader的拦截器。这个异常不会被spring包装。看到这样一个@Bean
函数,我会感到非常惊讶——Bean构造通常不是exceptional@SotiriosDelimanolis添加了一个示例。Spring生命周期将所有内容包装到BeanCreationException
中。在这种情况下,我没有看到异常处理程序被触发,无论是使用@ExceptionHandler(BeanCreationException.class)
还是使用@ExceptionHandler(MyException.class)
。使用@Order(Ordered.HIGHEST\u priority:)尝试一下,如果您在请求上下文中,那么它应该可以工作。