PlaytikaOSS / feign-reactive

Reactive Feign client inspired by https://github.com/OpenFeign project
Apache License 2.0
600 stars 119 forks source link

springboot 3.2 app not starting with reactive feign in class path #651

Open jbaddam17 opened 7 months ago

jbaddam17 commented 7 months ago

Invalid value type for attribute 'factoryBeanObjectType': java.lang.String

java.lang.IllegalStateException: Error processing condition on org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration.propertySourcesPlaceholderConfigurer
    at org.springframework.boot.autoconfigure.condition.SpringBootCondition.matches(SpringBootCondition.java:60) ~[spring-boot-autoconfigure-3.2.0.jar:3.2.0]
    at org.springframework.context.annotation.ConditionEvaluator.shouldSkip(ConditionEvaluator.java:108) ~[spring-context-6.1.1.jar:6.1.1]
    at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForBeanMethod(ConfigurationClassBeanDefinitionReader.java:183) ~[spring-context-6.1.1.jar:6.1.1]
    at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:144) ~[spring-context-6.1.1.jar:6.1.1]
    at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:120) ~[spring-context-6.1.1.jar:6.1.1]
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:428) ~[spring-context-6.1.1.jar:6.1.1]
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:289) ~[spring-context-6.1.1.jar:6.1.1]
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:349) ~[spring-context-6.1.1.jar:6.1.1]
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:118) ~[spring-context-6.1.1.jar:6.1.1]
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:775) ~[spring-context-6.1.1.jar:6.1.1]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:597) ~[spring-context-6.1.1.jar:6.1.1]
    at org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext.refresh(ReactiveWebServerApplicationContext.java:66) ~[spring-boot-3.2.0.jar:3.2.0]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:753) ~[spring-boot-3.2.0.jar:3.2.0]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:455) ~[spring-boot-3.2.0.jar:3.2.0]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:323) ~[spring-boot-3.2.0.jar:3.2.0]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1342) ~[spring-boot-3.2.0.jar:3.2.0]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1331) ~[spring-boot-3.2.0.jar:3.2.0]
    at u.s.apigateway.ApiGatewayApplication.main(ApiGatewayApplication.java:30) ~[classes/:na]
Caused by: java.lang.IllegalArgumentException: **Invalid value type for attribute 'factoryBeanObjectType': java.lang.String**
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getTypeForFactoryBeanFromAttributes(FactoryBeanRegistrySupport.java:86) ~[spring-beans-6.1.1.jar:6.1.1]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryBean(AbstractAutowireCapableBeanFactory.java:838) ~[spring-beans-6.1.1.jar:6.1.1]
    at org.springframework.beans.factory.support.AbstractBeanFactory.isTypeMatch(AbstractBeanFactory.java:620) ~[spring-beans-6.1.1.jar:6.1.1]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:573) ~[spring-beans-6.1.1.jar:6.1.1]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:532) ~[spring-beans-6.1.1.jar:6.1.1]
    at org.springframework.boot.autoconfigure.condition.OnBeanCondition.collectBeanNamesForType(OnBeanCondition.java:247) ~[spring-boot-autoconfigure-3.2.0.jar:3.2.0]
    at org.springframework.boot.autoconfigure.condition.OnBeanCondition.getBeanNamesForType(OnBeanCondition.java:240) ~[spring-boot-autoconfigure-3.2.0.jar:3.2.0]
    at org.springframework.boot.autoconfigure.condition.OnBeanCondition.getBeanNamesForType(OnBeanCondition.java:230) ~[spring-boot-autoconfigure-3.2.0.jar:3.2.0]
    at org.springframework.boot.autoconfigure.condition.OnBeanCondition.getMatchingBeans(OnBeanCondition.java:183) ~[spring-boot-autoconfigure-3.2.0.jar:3.2.0]
    at org.springframework.boot.autoconfigure.condition.OnBeanCondition.getMatchOutcome(OnBeanCondition.java:158) ~[spring-boot-autoconfigure-3.2.0.jar:3.2.0]
    at org.springframework.boot.autoconfigure.condition.SpringBootCondition.matches(SpringBootCondition.java:47) ~[spring-boot-autoconfigure-3.2.0.jar:3.2.0]
    ... 17 common frames omitted

using following version

openJDK17 spring-cloud.version 2023.0.0 spring boot parent version 3.2.0 feign-reactor-spring-cloud-starter version 4.0.3

NOTE: Application started normally after removing reactive feign from class path

ramzes3333 commented 7 months ago

Following fix should solve the problem:

Index: feign-reactor-spring-configuration/src/main/java/reactivefeign/spring/config/ReactiveFeignClientsRegistrar.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/feign-reactor-spring-configuration/src/main/java/reactivefeign/spring/config/ReactiveFeignClientsRegistrar.java b/feign-reactor-spring-configuration/src/main/java/reactivefeign/spring/config/ReactiveFeignClientsRegistrar.java
--- a/feign-reactor-spring-configuration/src/main/java/reactivefeign/spring/config/ReactiveFeignClientsRegistrar.java   (revision 01ff94d5eafceaa49c1ca2aee1928a8808ae56b9)
+++ b/feign-reactor-spring-configuration/src/main/java/reactivefeign/spring/config/ReactiveFeignClientsRegistrar.java   (date 1702303241012)
@@ -178,7 +178,8 @@

        String alias = name + "ReactiveFeignClient";
        AbstractBeanDefinition beanDefinition = definition.getBeanDefinition();
-       beanDefinition.setAttribute(FactoryBean.OBJECT_TYPE_ATTRIBUTE, className);
+       Class<?> type = ClassUtils.resolveClassName(className, null);
+       beanDefinition.setAttribute(FactoryBean.OBJECT_TYPE_ATTRIBUTE, type);

        boolean primary = (Boolean)attributes.get("primary"); // has a default, won't be null
zzzzizu123 commented 7 months ago

Hey, @ramzes3333

I am using the reactive feign client solution. Are you going to release a version with the fix, or should I use your example as solution in my code.

however, how can I implement your solution in my code?

Thanks ahead.

ramzes3333 commented 7 months ago

I think it's best to wait for the authors to release an official package with this fix. For testing purposes, you can clone my fork with this fix, build it, and integrate it into your project.

zzzzizu123 commented 6 months ago

Thanks @ramzes3333 I used your solution and it seems to be working. I encountered another issue that happens according to this: https://github.com/spring-projects/spring-boot/issues/38536

We get run error of finding multiple beans for feignConvrtionService. The solution should be to modify `

org.apache.maven.plugins
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
    <parameters>true</parameters>
</configuration>

`

As described here: https://github.com/spring-projects/spring-framework/wiki/Upgrading-to-Spring-Framework-6.x#core-container:~:text=jndi%2Dlookup%3E.-,Parameter%20Name%20Retention,-LocalVariableTableParameterNameDiscoverer%20has%20been

zzzzizu123 commented 6 months ago

Do you have any estimation when the version with the fix will be released? Thanks, ahead

ramzes3333 commented 6 months ago

Do you have any estimation when the version with the fix will be released? Thanks, ahead

@zzzzizu123 Unfortunately, I do not have the knowledge of when the version with the fix will be released. I am not the owner of this repository. Just like you, I use this library and want to use it together with Spring Boot in version 3.2 :)

fflandrin-yseop commented 6 months ago

We are having the same issue. Using @ramzes3333 fork works great as a temporary fix while waiting for a release with a permanent fix.

Ahoo-Wang commented 5 months ago

I waited too long for this feature, so I had to create CoApi - https://github.com/Ahoo-Wang/CoApi

miwurster commented 5 months ago

Following fix should solve the problem:

Index: feign-reactor-spring-configuration/src/main/java/reactivefeign/spring/config/ReactiveFeignClientsRegistrar.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/feign-reactor-spring-configuration/src/main/java/reactivefeign/spring/config/ReactiveFeignClientsRegistrar.java b/feign-reactor-spring-configuration/src/main/java/reactivefeign/spring/config/ReactiveFeignClientsRegistrar.java
--- a/feign-reactor-spring-configuration/src/main/java/reactivefeign/spring/config/ReactiveFeignClientsRegistrar.java (revision 01ff94d5eafceaa49c1ca2aee1928a8808ae56b9)
+++ b/feign-reactor-spring-configuration/src/main/java/reactivefeign/spring/config/ReactiveFeignClientsRegistrar.java (date 1702303241012)
@@ -178,7 +178,8 @@

      String alias = name + "ReactiveFeignClient";
      AbstractBeanDefinition beanDefinition = definition.getBeanDefinition();
-     beanDefinition.setAttribute(FactoryBean.OBJECT_TYPE_ATTRIBUTE, className);
+     Class<?> type = ClassUtils.resolveClassName(className, null);
+     beanDefinition.setAttribute(FactoryBean.OBJECT_TYPE_ATTRIBUTE, type);

      boolean primary = (Boolean)attributes.get("primary"); // has a default, won't be null

Hey guys, is there a plan to release this fix somehow soon(ish)?

Jardo-51 commented 4 months ago

EDIT: this solution doesn't work if you need to use any extended functionality, such as request interceptors

I managed to figure out a workaround to use the solution from @ramzes3333 without having to build my own version of the entire project.

  1. Copy the implementation of ReactiveFeignClientsRegistrar into your project. It uses a couple of package-private classes. You have to copy those as well.
  2. Make the fix suggested by @ramzes3333
  3. Copy the annotation @EnableReactiveFeignClients into your project and modify the @Import annotation to use your custom implementation of ReactiveFeignClientsRegistrar
  4. Modify your implementation of ReactiveFeignClientsRegistrar to use your custom implementation of @EnableReactiveFeignClients (from the previous step).
  5. Define a bean of type FormattingConversionService and mark it as @Primary

And that's it. Happy coding :)

tomaszwasik commented 4 months ago

Hey guys, is there a plan to release this fix somehow soon(ish)?

sahassakhare commented 4 months ago

Hi team, any plans to release spring boot 3.2.x compatible version ?

caosDvlp commented 4 months ago

Hi Guys! I'm in the same state as the rest, any plasn to release spring boot 3.2.x compatible version ?

9you commented 3 months ago

I managed to figure out a workaround to use the solution from @ramzes3333 without having to build my own version of the entire project.

  1. Copy the implementation of ReactiveFeignClientsRegistrar into your project. It uses a couple of package-private classes. You have to copy those as well.
  2. Make the fix suggested by @ramzes3333
  3. Copy the annotation @EnableReactiveFeignClients into your project and modify the @Import annotation to use your custom implementation of ReactiveFeignClientsRegistrar
  4. Modify your implementation of ReactiveFeignClientsRegistrar to use your custom implementation of @EnableReactiveFeignClients (from the previous step).
  5. Define a bean of type FormattingConversionService and mark it as @Primary

And that's it. Happy coding :)

This solution not working with Load Balancer and Resilience4 :(

kyra-ohare commented 2 months ago

Hi I would also love to know when this will be Spring Boot 3 compatible. Please.

ChiragMoradiya commented 2 months ago

Hi, we also encountered the same issue. This limits us to upgrade spring-boot to 3.1 only. Is there any timeline planned for the fix?

Jardo-51 commented 2 months ago

I have created a fork of @ramzes3333's fix and published a new version to Maven Central, to make it available for everyone.

Just replace the starter dependency in your pom.xml with this, and it should work:

        <dependency>
            <groupId>com.jardoapps.reactivefeign</groupId>
            <artifactId>feign-reactor-spring-cloud-starter</artifactId>
            <version>4.1.0</version>
            <type>pom</type>
        </dependency>

If you need any other modules, just replace the groupId with com.jardoapps.reactivefeign and the version with 4.1.0.

ChiragMoradiya commented 2 months ago

Thanks @Jardo-51 we will try it for sure.

ramzes3333 commented 2 months ago

Hi, we also encountered the same issue. This limits us to upgrade spring-boot to 3.1 only. Is there any timeline planned for the fix?

I think the project is abandoned. In my project, I replaced Feign Reactive with a pure solution based on WebClient.

Jardo-51 commented 2 months ago

I think the project is abandoned.

That's the reason why I decided to fork it and publish a new version.