MethodInvokingFactoryBean returns 本身而不是所需的对象
MethodInvokingFactoryBean returns itself instead of desired object
我正在尝试使用 MethodInvokingFactoryBean
获取 com.amazonaws.regions.Region
的实例以用于配置 com.amazonaws.services.kinesis.AmazonKinesisClient
。我在 Blueprint、Camel、Karaf 中这样做。
<bean id="awsRegion" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetClass" value="com.amazonaws.regions.RegionUtils"/>
<property name="targetMethod" value="getRegion"/>
<property name="arguments">
<list>
<value>EU-WEST-1</value>
</list>
</property>
</bean>
<bean id="kinesisClient" class="com.amazonaws.services.kinesis.AmazonKinesisClient">
<property name="region" ref="awsRegion"/>
</bean>
这看起来应该可行,第一个 bean 创建一个区域,第二个 bean 使用它。
但是,我收到一个错误,看起来 MethodInvokingFactoryBean 只是 return 自身的实例而不是 Region。
org.osgi.service.blueprint.container.ComponentDefinitionException: Error setting property: PropertyDescriptor <name: region, getter: null, setter: [class com.amazonaws.AmazonWebServiceClient.setRegion(class com.amazonaws.regions.Region)]
...
Caused by: java.lang.Exception: Unable to convert value org.springframework.beans.factory.config.MethodInvokingFactoryBean@2289c050 to type com.amazonaws.regions.Region
我在 RegionUtils 中调用的方法应该 return 一个区域
https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/regions/RegionUtils.html#getRegion-java.lang.String-
在这个问题中,我想到了这种在客户端中获取区域的方法,解决方案似乎对提问者有效。
首先,这里的 apache-camel 标签是多余的。其次,您错过了提问者正在使用 spring 上下文,而您正在使用蓝图上下文。尝试这样的事情:
<bean id="awsRegion" class="com.amazonaws.regions.RegionUtils" factory-method="getRegion">
<argument value="EU-WEST-1"/>
</bean>
<bean id="kinesisClient" class="com.amazonaws.services.kinesis.AmazonKinesisClient">
<property name="region" ref="awsRegion"/>
</bean>
编辑:刚刚用最新的 aws-java-sdk 测试了这个例子,它成功了
我正在尝试使用 MethodInvokingFactoryBean
获取 com.amazonaws.regions.Region
的实例以用于配置 com.amazonaws.services.kinesis.AmazonKinesisClient
。我在 Blueprint、Camel、Karaf 中这样做。
<bean id="awsRegion" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetClass" value="com.amazonaws.regions.RegionUtils"/>
<property name="targetMethod" value="getRegion"/>
<property name="arguments">
<list>
<value>EU-WEST-1</value>
</list>
</property>
</bean>
<bean id="kinesisClient" class="com.amazonaws.services.kinesis.AmazonKinesisClient">
<property name="region" ref="awsRegion"/>
</bean>
这看起来应该可行,第一个 bean 创建一个区域,第二个 bean 使用它。
但是,我收到一个错误,看起来 MethodInvokingFactoryBean 只是 return 自身的实例而不是 Region。
org.osgi.service.blueprint.container.ComponentDefinitionException: Error setting property: PropertyDescriptor <name: region, getter: null, setter: [class com.amazonaws.AmazonWebServiceClient.setRegion(class com.amazonaws.regions.Region)]
...
Caused by: java.lang.Exception: Unable to convert value org.springframework.beans.factory.config.MethodInvokingFactoryBean@2289c050 to type com.amazonaws.regions.Region
我在 RegionUtils 中调用的方法应该 return 一个区域 https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/regions/RegionUtils.html#getRegion-java.lang.String-
在这个问题中,我想到了这种在客户端中获取区域的方法,解决方案似乎对提问者有效。
首先,这里的 apache-camel 标签是多余的。其次,您错过了提问者正在使用 spring 上下文,而您正在使用蓝图上下文。尝试这样的事情:
<bean id="awsRegion" class="com.amazonaws.regions.RegionUtils" factory-method="getRegion">
<argument value="EU-WEST-1"/>
</bean>
<bean id="kinesisClient" class="com.amazonaws.services.kinesis.AmazonKinesisClient">
<property name="region" ref="awsRegion"/>
</bean>
编辑:刚刚用最新的 aws-java-sdk 测试了这个例子,它成功了