MethodInvokingFactoryBean возвращает себя вместо желаемого объекта

Я пытаюсь использовать 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>

Похоже, что это должно работать, когда первый компонент создает регион, а второй компонент использует его.

Однако я получаю сообщение об ошибке, из-за которого создается впечатление, что MethodInvokingFactoryBean просто возвращает экземпляр самого себя вместо региона.

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, должен возвращать регион https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/regions/RegionUtils.html#getRegion-java.lang.String-

Я столкнулся с этим способом получения региона в клиенте в этом вопросе, где решение, похоже, сработало для спрашивающего.

Привязать область верблюда aws sqs


person lbenedetto    schedule 21.02.2020    source источник
comment
Не смешивайте весну и план, используйте только план   -  person Claus Ibsen    schedule 21.02.2020


Ответы (1)


Во-первых, тег apache-camel здесь лишний. Во-вторых, вы пропустили, что спрашивающий использует контекст Spring, а вы используете контекст blueprint. Попробуйте что-то вроде этого:

<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, и он работает

person c0ld    schedule 21.02.2020
comment
Ну, это немного меняет ошибку, но все равно не работает: RuntimeException: невозможно преобразовать в класс com.amazonaws.regions.Region. - person lbenedetto; 21.02.2020
comment
Отредактируйте, пожалуйста, вопрос с трассировкой стека нового исключения - person c0ld; 21.02.2020
comment
Хм, только что попробовал еще раз, и это действительно работает. Должно быть, вы неправильно скопировали свой ответ или что-то в этом роде. Хотя аргумент региона должен быть строчным. - person lbenedetto; 25.02.2020