问题

  1. restTemplate 不支持PATCH 方法
  2. 我的配置类为重新设置 restTemplate 的超时 以及 利用 OkHttpClient 作为请求,但是一直不加载
@Configuration
public class RestTemplateConfig {

    // 连接超时时间,单位毫秒
    private static final int CONNECT_TIMEOUT = 10000; 

    // 读取超时时间,单位毫秒
    private static final int READ_TIMEOUT = 200000;

    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder) {
        return builder
                // 设置连接超时
                .setConnectTimeout(Duration.ofMillis(CONNECT_TIMEOUT))
                // 设置读取超时
                .setReadTimeout(Duration.ofMillis(READ_TIMEOUT))
                .requestFactory(() -> new OkHttp3ClientHttpRequestFactory(new OkHttpClient.Builder().build()))
                .build();
    }
}

1. 检查配置是否正确

确保项目中所有与 RestTemplate 相关的配置正确且唯一。检查 application.ymlapplication.properties 文件,确认是否存在重复的配置或冲突的依赖项。

没问题

2. 验证启动类位置

确认启动类位于正确的包路径下,且未被其他子类或配置类覆盖。启动类通常应位于根包或其子包中,确保组件扫描能正确覆盖所有配置类。

没问题

3. 日志调试同名配置或 Bean

application.yml 中启用调试日志,检查是否存在同名 Bean 或配置冲突。添加以下配置以打印 Bean 加载信息:

logging:
  level:
    org.springframework.beans.factory: debug

日志会显示类似以下信息,帮助定位重复的 Bean 定义:

Overriding bean definition for bean 'restTemplate' with a different definition: replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=null; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=restTemplateConfig; factoryMethodName=restTemplate; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [com/joivin/model/config/RestTemplateConfig.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=null; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=com.pig4cloud.pig.common.core.config.RestTemplateConfiguration; factoryMethodName=restTemplate; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [com/pig4cloud/pig/common/core/config/RestTemplateConfiguration.class]]

从日志中可以发现,当前加载的restTemplate 来自于 factoryBeanName=com.pig4cloud.pig.common.core.config.RestTemplateConfiguration,
好的既然找到了,那么干掉他就行了

  1. 我们可以找到引入他的具体依赖,选择从pom中移除他
  2. 简单粗暴,我们直接排查他自己

排除冲突配置

如果发现多个模块定义了相同的 Bean(如 RestTemplate),可以通过 spring.autoconfigure.exclude 排除冲突的配置类。例如:

spring:
  autoconfigure:
    exclude: com.pig4cloud.pig.common.core.config.RestTemplateConfiguration

再次断点,看下效果

效果

至此可以看到已经成功加载到这个配置了

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐