feign-reactive icon indicating copy to clipboard operation
feign-reactive copied to clipboard

springboot 3.2 app not starting with reactive feign in class path

Open jbaddam17 opened this issue 6 months ago • 20 comments

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

jbaddam17 avatar Dec 08 '23 16:12 jbaddam17

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
 

ramzes3333 avatar Dec 11 '23 14:12 ramzes3333

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.

zzzzizu123 avatar Dec 11 '23 17:12 zzzzizu123

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.

ramzes3333 avatar Dec 11 '23 17:12 ramzes3333

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 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <parameters>true</parameters> </configuration> </plugin>

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 avatar Dec 17 '23 14:12 zzzzizu123

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

zzzzizu123 avatar Dec 17 '23 14:12 zzzzizu123

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 :)

ramzes3333 avatar Dec 18 '23 10:12 ramzes3333

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

fflandrin-yseop avatar Jan 05 '24 15:01 fflandrin-yseop

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

Ahoo-Wang avatar Jan 18 '24 09:01 Ahoo-Wang

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)?

miwurster avatar Feb 12 '24 14:02 miwurster

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 :)

Jardo-51 avatar Feb 14 '24 16:02 Jardo-51

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

tomaszwasik avatar Feb 19 '24 09:02 tomaszwasik

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

sahassakhare avatar Feb 27 '24 12:02 sahassakhare

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

caosDvlp avatar Feb 27 '24 15:02 caosDvlp

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 :(

9you avatar Apr 10 '24 01:04 9you

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

kyra-ohare avatar Apr 16 '24 08:04 kyra-ohare

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?

ChiragMoradiya avatar May 08 '24 11:05 ChiragMoradiya

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.

Jardo-51 avatar May 08 '24 19:05 Jardo-51

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

ChiragMoradiya avatar May 09 '24 03:05 ChiragMoradiya

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.

ramzes3333 avatar May 10 '24 10:05 ramzes3333

I think the project is abandoned.

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

Jardo-51 avatar May 10 '24 11:05 Jardo-51