Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 请求范围Bean的Bean创建错误_Java_Spring_Rest_Spring Boot_Spring Mvc - Fatal编程技术网

Java 请求范围Bean的Bean创建错误

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

当Springbean被注释为
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:)尝试一下,如果您在请求上下文中,那么它应该可以工作。