diff --git a/devops-boot-project/devops-boot-core/devops-service-servlet/src/main/kotlin/com/tencent/devops/service/ServiceServletAutoConfiguration.kt b/devops-boot-project/devops-boot-core/devops-service-servlet/src/main/kotlin/com/tencent/devops/service/ServiceServletAutoConfiguration.kt index b103b4c..544ab58 100644 --- a/devops-boot-project/devops-boot-core/devops-service-servlet/src/main/kotlin/com/tencent/devops/service/ServiceServletAutoConfiguration.kt +++ b/devops-boot-project/devops-boot-core/devops-service-servlet/src/main/kotlin/com/tencent/devops/service/ServiceServletAutoConfiguration.kt @@ -1,18 +1,15 @@ package com.tencent.devops.service -import com.tencent.devops.service.feign.CustomSpringMvcContract +import com.tencent.devops.service.feign.FeignGlobalConfiguration import com.tencent.devops.service.feign.FeignFilterRequestMappingHandlerMapping -import feign.Contract import org.springframework.boot.autoconfigure.AutoConfigureBefore import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration import org.springframework.boot.autoconfigure.web.servlet.WebMvcRegistrations -import org.springframework.cloud.openfeign.AnnotatedParameterProcessor -import org.springframework.cloud.openfeign.FeignClientProperties import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration +import org.springframework.context.annotation.Import import org.springframework.context.annotation.PropertySource -import org.springframework.core.convert.ConversionService /** * Service自动化配置类 @@ -20,6 +17,7 @@ import org.springframework.core.convert.ConversionService @Configuration(proxyBeanMethods = false) @PropertySource("classpath:common-service.properties") @ConditionalOnWebApplication +@Import(FeignGlobalConfiguration::class) @AutoConfigureBefore(WebMvcAutoConfiguration::class) class ServiceServletAutoConfiguration { @@ -29,14 +27,4 @@ class ServiceServletAutoConfiguration { override fun getRequestMappingHandlerMapping() = FeignFilterRequestMappingHandlerMapping() } } - - @Bean - fun feignContract( - feignClientProperties: FeignClientProperties?, - parameterProcessors: List, - feignConversionService: ConversionService, - ): Contract { - val decodeSlash = feignClientProperties == null || feignClientProperties.isDecodeSlash - return CustomSpringMvcContract(parameterProcessors, feignConversionService, decodeSlash) - } } diff --git a/devops-boot-project/devops-boot-core/devops-service-servlet/src/main/kotlin/com/tencent/devops/service/feign/FeignGlobalConfiguration.kt b/devops-boot-project/devops-boot-core/devops-service-servlet/src/main/kotlin/com/tencent/devops/service/feign/FeignGlobalConfiguration.kt new file mode 100644 index 0000000..b5a127a --- /dev/null +++ b/devops-boot-project/devops-boot-core/devops-service-servlet/src/main/kotlin/com/tencent/devops/service/feign/FeignGlobalConfiguration.kt @@ -0,0 +1,36 @@ +package com.tencent.devops.service.feign + +import feign.Contract +import org.springframework.cloud.openfeign.AnnotatedParameterProcessor +import org.springframework.cloud.openfeign.FeignClientProperties +import org.springframework.cloud.openfeign.FeignFormatterRegistrar +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.core.convert.ConversionService +import org.springframework.format.support.DefaultFormattingConversionService +import org.springframework.format.support.FormattingConversionService + +/** + * feign的全局配置 + * */ +@Configuration +class FeignGlobalConfiguration { + @Bean + fun feignContract( + parameterProcessors: List, + feignClientProperties: FeignClientProperties?, + feignConversionService: ConversionService, + ): Contract { + val decodeSlash = feignClientProperties?.isDecodeSlash ?: true + return OldSpringMvcContract(parameterProcessors, feignConversionService, decodeSlash) + } + + @Bean + fun feignConversionService(feignFormatterRegistrars: List): FormattingConversionService { + val conversionService: FormattingConversionService = DefaultFormattingConversionService() + for (feignFormatterRegistrar in feignFormatterRegistrars) { + feignFormatterRegistrar.registerFormatters(conversionService) + } + return conversionService + } +} diff --git a/devops-boot-project/devops-boot-core/devops-service-servlet/src/main/kotlin/com/tencent/devops/service/feign/CustomSpringMvcContract.kt b/devops-boot-project/devops-boot-core/devops-service-servlet/src/main/kotlin/com/tencent/devops/service/feign/OldSpringMvcContract.kt similarity index 83% rename from devops-boot-project/devops-boot-core/devops-service-servlet/src/main/kotlin/com/tencent/devops/service/feign/CustomSpringMvcContract.kt rename to devops-boot-project/devops-boot-core/devops-service-servlet/src/main/kotlin/com/tencent/devops/service/feign/OldSpringMvcContract.kt index c2f76f6..ce432e3 100644 --- a/devops-boot-project/devops-boot-core/devops-service-servlet/src/main/kotlin/com/tencent/devops/service/feign/CustomSpringMvcContract.kt +++ b/devops-boot-project/devops-boot-core/devops-service-servlet/src/main/kotlin/com/tencent/devops/service/feign/OldSpringMvcContract.kt @@ -12,14 +12,20 @@ import org.springframework.util.StringUtils import org.springframework.web.bind.annotation.RequestMapping /** - * 解决feign client不允许@RequestMapping注解的问题 + * 新版本的Spring Cloud的@FeignClient出于安全考虑(不是十分理解),不允许使用@RequestMapping, + * 但这对现有的使用方式有很大的影响,需要修改所有的FeignClient,所以这里我们恢复之前的逻辑,允许在 + * FeignClient上使用RequestMapping定义公共的路由前缀。 * */ -class CustomSpringMvcContract( +class OldSpringMvcContract( annotatedParameterProcessors: List, conversionService: ConversionService, private val decodeSlash: Boolean, ) : SpringMvcContract(annotatedParameterProcessors, conversionService, decodeSlash) { private val resourceLoader = DefaultResourceLoader() + + /** + * 旧版本的SpringMvcContract处理逻辑 + * */ override fun processAnnotationOnClass(data: MethodMetadata, clz: Class<*>) { if (clz.interfaces.isEmpty()) { val classAnnotation = findMergedAnnotation(clz, RequestMapping::class.java)