缺少资源 bean:Spring Boot webflux 自定义全局异常处理程序

Posted

技术标签:

【中文标题】缺少资源 bean:Spring Boot webflux 自定义全局异常处理程序【英文标题】:Missing Resources bean : Springboot web-flux Custom Global Exception handler 【发布时间】:2022-01-15 03:47:19 【问题描述】:

我正在尝试通过扩展 AbstractErrorWebExceptionHandler 来实现我的自定义 GlobalExceptionHandler 类(默认实现是 DefaultErrorWebExceptionHandler 类)但无法这样做,因为缺少构造函数初始化所需的 bean(如下所述)。我不确定为什么会发生这种情况由于默认实现它工作正常,并且通过提供我自己的实现它要求一个 bean,请帮助

@Component
@Order(-2)
public class GlobalExceptionHandler extends AbstractErrorWebExceptionHandler

    public GlobalExceptionHandler(ErrorAttributes errorAttributes, Resources resources, ApplicationContext applicationContext) 
        super(errorAttributes, resources, applicationContext);
    

    @Override
    protected RouterFunction<ServerResponse> getRoutingFunction(ErrorAttributes errorAttributes) 
        return RouterFunctions.route(RequestPredicates.all(),this::formatErrorResponse);
    

    private Mono<ServerResponse> formatErrorResponse(ServerRequest request)
        Map<String, Object> errorAttributesMap = getErrorAttributes(request, ErrorAttributeOptions.defaults());
        int status = (int) Optional.ofNullable(errorAttributesMap.get("status")).orElse(500);
        return ServerResponse
                .status(status)
                .contentType(MediaType.APPLICATION_JSON)
                .body(BodyInserters.fromValue(errorAttributesMap));
    

我得到的错误是:

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 1 of constructor in com.example.userManagementSystem.demoApp.exception.GlobalExceptionHandler required a bean of type 'org.springframework.boot.autoconfigure.web.WebProperties$Resources' that could not be found.


Action:

Consider defining a bean of type 'org.springframework.boot.autoconfigure.web.WebProperties$Resources' in your configuration.


Process finished with exit code 1

我不确定为什么会这样。请帮忙!

【问题讨论】:

你的班级需要一个没有提供的Resources resources,没有看到更多你的应用程序和你的配置,这是不可能回答的 【参考方案1】:
@Slf4j
@Component
@Order(-99)
public class ExceptionHandler implements WebExceptionHandler 
    @Override
    public Mono<Void> handle(ServerWebExchange serverWebExchange, Throwable throwable) 
        ServerHttpResponse response = serverWebExchange.getResponse();
        response.setStatusCode(HttpStatus.BAD_REQUEST);
        response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
        JSONObject resMsg = new JSONObject();
        try 
            resMsg.put("code", HttpStatus.BAD_REQUEST.value());
            if(throwable instanceof CommonException)
                resMsg.put("msg", ((CommonException) throwable).getMsg());
            else
                log.error("system error:", throwable);
                resMsg.put("msg", CommonCode.PLATFORM_ERR_MSG);
            
         catch (Exception e) 
        

        DataBuffer db = response.bufferFactory().wrap(resMsg.toString().getBytes(Charset.forName("UTF-8")));
        return response.writeWith(Mono.just(db));
    

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。【参考方案2】:

兄弟。对不起我的英语不好。 Y 可以注入 WebProperties。下一步 y 可以从此属性执行 getResourses() 。希望对你有所帮助。

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。 没问题兄弟,是的,你是对的! :)【参考方案3】:

当我将我的 Webflux api 应用程序从 Springboot 版本 2.5.x 迁移到 2.6.2 时,我遇到了同样的异常。

为了解决这个问题,我添加了一个配置类,它为WebProperties.Resources 创建了一个 Bean,如下所示,

@Configuration
public class ResourceWebPropertiesConfig 

    @Bean
    public WebProperties.Resources resources() 
        return new WebProperties.Resources();
    


这解决了这个问题。我猜 Springboot 版本 2.6.x 发生了一些变化

【讨论】:

是的,你是对的! springboot 2.6.x 版本发生了一些变化。

以上是关于缺少资源 bean:Spring Boot webflux 自定义全局异常处理程序的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot / Tomcat,“由于缺少ServletWebServerFactory bean而无法启动ServletWebServerApplicationContext”

Spring Boot 错误:由于缺少 EmbeddedServletContainerFactory bean,无法启动 EmbeddedWebApplicationContext

Spring Boot 测试 java.lang.IllegalStateException:无法加载 ApplicationContext 并且缺少 bean

Spring Boot Test 失败说,由于缺少 ServletWebServerFactory bean,无法启动 ServletWebServerApplicationContext

Spring Boot Test 失败说,由于缺少 ServletWebServerFactory bean,无法启动 ServletWebServerApplicationContext

spring boot 静态资源映射