【问题标题】:Kotlin: RestTemplateCustomizer customize() method is not being calledKotlin:未调用 RestTemplateCustomizer 自定义()方法
【发布时间】:2021-08-01 12:11:35
【问题描述】:
  • 我正在为应用程序中的所有 RestTemplate api 调用编写自定义 ResponseErrorHandler。此应用是一个 Spring Boot 应用,使用 Kotlin 编写

我的代码:

ServiceApiErrorHandler.class

class ServiceApiErrorHandler(
    @Autowired
    val agentAuthService: AgentAuthService
) : DefaultResponseErrorHandler() {
    companion object {
        private val logger: LogService = LogServiceImpl(ServiceApiErrorHandler::class.java)
    }

    override fun hasError(response: ClientHttpResponse): Boolean {
        return (response.statusCode.is4xxClientError || response.statusCode.is5xxServerError)
    }

    override fun handleError(response: ClientHttpResponse) {
        logger.info("LOGIN AGAIN 1")

    }

    override fun handleError(url: URI, method: HttpMethod, response: ClientHttpResponse) {
        if (response.statusCode == HttpStatus.UNAUTHORIZED && ServiceApiEnpoint.isServiceApiEndpoint(url = url.toString())) {
            logger.info("LOGIN AGAIN")
            agentAuthService.callLogin();
        }
    }
}

CustomRestTemplateCustomizer 类

class CustomRestTemplateCustomizer(
    @Autowired
    val agentAuthService: AgentAuthService
) : RestTemplateCustomizer {
    override fun customize(restTemplate: RestTemplate) {
            restTemplate.errorHandler = ServiceApiErrorHandler(agentAuthService = agentAuthService)
    }
}

ClientHttpConfig 类

@Configuration
class ClientHttpConfig(
    @Autowired
    val agentAuthService: AgentAuthService
) {
    @Bean
    fun customRestTemplateCustomizer(): CustomRestTemplateCustomizer {
        return CustomRestTemplateCustomizer(agentAuthService = agentAuthService);
    }
}

问题是当我运行时,RestTemplate 仍然使用 DefaultResponseErrorHandler 处理错误,调试后,我很快意识到 CustomRestTemplateCustomizer 类中的 customize() 方法从未被调用。

所以我的问题是:

  • custom() 方法是否应该是自动调用的?如果不是,我应该怎么称呼它?
  • 我的代码可以实现自定义的ResponseErrorHandler吗?

注意:我按照 Java 教程:https://www.baeldung.com/spring-rest-template-builder 用 Kotlin 编写此版本。

【问题讨论】:

    标签: java spring spring-boot kotlin resttemplate


    【解决方案1】:

    如何创建 RestTemplate 实例?

    尝试添加一个Bean,然后应该使用定制器

    @Configuration
    class ClientHttpConfig(
        @Autowired
        val agentAuthService: AgentAuthService,
        @Autowired val builder: RestTemplateBuilder
    ) {
        @Bean
        fun customRestTemplateCustomizer(): CustomRestTemplateCustomizer {
            return CustomRestTemplateCustomizer(agentAuthService = agentAuthService);
        }
    
        @Bean
        fun customizedRestTemplate(): RestTemplate {
            return builder.build();
        }
    }
    

    编辑:需要由 RestTemplateBuilder 创建

    【讨论】:

    • 这不是回答我的问题 :( 调试时,我已经按照您的建议进行了尝试,并且仅使用 MposApiErrorHandler.class 一切正常,不需要其他类。但是 我的主要原因是创建这些自定义类是否可以为整个应用程序中的所有 RestTemplate API 调用进行配置
    • customize 是由 RestTemplateBuilder 调用来创建一个 RestTemplate,所以如果你自己创建其他 RestTemplate 实例,它不会这样工作
    • 在本教程baeldung.com/spring-rest-template-builder 第 3 节中,它建议 这是让应用程序中使用的每个 RestTemplate 都在其上设置自定义 errorHandler 的方法 .所以你认为我在这里误解了一些东西,或者它在 Kotlin 中的工作方式不一样?
    • 在Java中也是一样的,如果你使用new创建一个RestTemplate,它不会使用定制器......教程在这部分是错误的,或者只是错过了由RestTemplateBuilder创建它的提示跨度>
    • 只需在配置类中定义一个bean,然后将创建的RestTemplate 实例注入您要使用的类中。或者注入 RestTemplateBuilder 并使用 build()
    猜你喜欢
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 2021-11-21
    • 1970-01-01
    相关资源
    最近更新 更多