java - Camel,Amazon SQS - 没有类型转换器可用于将类型 : java. lang.String 转换为所需类型 : com. amazonaws.services.sqs.AmazonSQS

标签 java spring amazon-web-services apache-camel amazon-sqs

我目前正在使用 Camel 开发一个 Spring 应用程序,它将轮询 SQS 作为应用程序的入口点(第一条路线)。 我使用 Spring 的基于 XML 的方法成功地实现了这一目标。

我的 AmazonSQSClient Bean:

<bean id="sqsClient" class="com.amazonaws.services.sqs.AmazonSQSClient">
    <constructor-arg ref="sqsCredentialsProvider" />
    <property name="endpoint" value="${aws.sqs.endpoint}" />
</bean>

我的 Camel 路线:

<route id="pollMessages">
    <from id="sqsEndpoint" uri="aws-sqs://{{queue.name}}?amazonSQSClient=#sqsClient&amp;deleteAfterRead=false" />
    <to uri="direct:readSQSMessage" />
</route>

使用上述方法,此时一切正常。

现在我正在尝试将我所有的 bean 和 Camel 配置迁移到基于 Java 的方法。

我创建了我的 Amazon SQS 客户端 Bean,如下所示:

@Bean
public AmazonSQS sqsClient(){
    ClientConfiguration clientConfiguration = new ClientConfiguration();
    AmazonSQSClient client = new AmazonSQSClient(sqsCredentialsProvider(), clientConfiguration);
    client.setEndpoint(sqsEndpoint);

    return client;
}

而且,我正在创建 Camel 路线(片段),如下所示:

@Bean
public CamelContext camelContext() throws Exception{
    CamelContext camelContext = new DefaultCamelContext();

    camelContext.addRoutes(new RouteBuilder() {
        @Override
        public void configure() {

            from("aws-sqs://"+fulfillmentQueueName+"?amazonSQSClient=#sqsClient&amp;delay="+fulfillmentQueuePollInterval)
            .to("direct:parseSQSMessage");

            }
    });

    camelContext.start();
    return camelContext;
}

但是,我在使用这种方法时遇到错误:

java.lang.IllegalArgumentException:找不到属性的合适 setter :amazonSQSClient 因为没有具有相同类型的 setter 方法:java.lang.String 也没有类型转换可能:没有可用于从类型转换的类型转换器: java.lang.String 到所需的类型:com.amazonaws.services.sqs.AmazonSQS,值为#sqsClient

我读了here如何构建Java风格的Camel Route

我读了here我需要将 AWS 客户端绑定(bind)到注册表 (registry.bind) 但我无法在除 JNDI 之外的任何注册表上找到绑定(bind)方法

我也试过这个:

SimpleRegistry registry = new SimpleRegistry();
registry.put("sqsClient", sqsClient());

CamelContext camelContext = new DefaultCamelContext(registry);

但得到了同样的错误。

我进行了很多搜索并尝试阅读,计划继续做更多但无法找到任何完成我需要做的事情的完整示例。片段在这里很有帮助。

非常感谢任何帮助。谢谢

最佳答案

对于 amazonSQSClient=#sqsClient 参数,Camel 尝试在注册表 (ApplicationContextRegistry) 中找到一个条目,其中键是 sqsClient

在您的第一个解决方案中(您在 xml 中指定了 bean),您设置了 bean 的 id 并且 Camel 在 ApplicationContextRegistry 中使用 id=sqsClient 注册了 bean。但是当您在代码中配置 bean 时,您还没有设置它的 ID/名称,所以 Camel 没有找到它。要使其工作,您必须设置 Bean 的名称!

解决方法:

@Bean(name = "sqsClient")
public AmazonSQS sqsClient(){
    ClientConfiguration clientConfiguration = new ClientConfiguration();
    AmazonSQSClient client = new AmazonSQSClient(sqsCredentialsProvider(), clientConfiguration);
    client.setEndpoint(sqsEndpoint);
    return client;
}

关于java - Camel,Amazon SQS - 没有类型转换器可用于将类型 : java. lang.String 转换为所需类型 : com. amazonaws.services.sqs.AmazonSQS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28245645/

相关文章:

java - 使用 spring mail 将邮件发送到 gmail 帐户的问题

java - 来自 tomcat 的 NoClassDefFoundError。我的 pom 有问题吗?

amazon-web-services - AWS Step Functions 中的 Docker 镜像

android - 放大初始化不断失败

java - JSON 简单解析器中超过 LONG.MAX_VALUE

java - 尝试读取txt文件并将它们转换为具有不同原语的对象

Spring 启动, Spring 启动启动器数据jpa : database type NONE or Cannot find changelog location

python - 通过boto3同步两个桶

java - 如何启动一个带有可选命令行参数(即文件名)的 java eclipse 程序

java - 将列表复制到另一个列表(带或不带 'new')之间的区别 - JAVA