2016-11-08 6 views
2

私はキューからEmployeeオブジェクトのリストを消費するスプリングブートamqpを使用しています。私のリスナメソッドは次のようになります。rabbitmqのレコードのリストを消費するジャクソンの設定

@RabbitListener(queues = "emp_queue") 
public void processAndPortEmployeeData(List<Employee> empList) { 
    empList.forEach(emp -> { some logic }) 
} 

をしかし、私はメッセージを消費しようとすると、私はクラスのキャスト例外を取得:何らかの理由で、私はのLinkedHashMapを取得しています。

Caused by: java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.integration.domain.Employee 

私は、単一の従業員オブジェクトを消費する私のリスナーメソッドを変更すると、それが正常に動作し、私はそれのために、以下のジャクソンの設定を使用しています:

@Configuration 
@EnableRabbit 
public class RabbitConfiguration implements RabbitListenerConfigurer { 

@Bean 
public MappingJackson2MessageConverter jackson2Converter() { 
    return new MappingJackson2MessageConverter(); 
} 

@Bean 
public DefaultMessageHandlerMethodFactory handlerMethodFactory() { 
    DefaultMessageHandlerMethodFactory factory = new DefaultMessageHandlerMethodFactory(); 
    factory.setMessageConverter(jackson2Converter()); 
    return factory; 
} 

@Override 
public void configureRabbitListeners(RabbitListenerEndpointRegistrar registrar) { 
    registrar.setMessageHandlerMethodFactory(handlerMethodFactory()); 
} 

} 

他のいくつかのジャクソンの設定があることをI従業員オブジェクトのリストを消費する必要がありますか?

ありがとうございます!私がかかります

サンプル入力JSONメッセージ:

[ 
    { 
    "name" : "Jasmine", 
    "age" : "24", 
    "emp_id" : 1344 
    }, 
    { 
    "name" : "Mark", 
    "age" : "32", 
    "emp_id" : 1314 
    } 
] 

答えて

3

あなたは春AMQPのどのバージョンを使用していますか?

1.6以上の場合、フレームワークは引数型をメッセージコンバータに渡します。

1.6より前のバージョンでは、メッセージヘッダーに情報を入力するか、タイプ情報でコンバータを構成する必要があります。つまり、コンバータはマップを作成したので、受信したもの(リストではないもの)であることを意味します。

メッセージにJSONのサンプルを表示してください。

EDITそのタイプの単一のBeanがあるかどうメッセージコンバータを自動的に設定するブート

注...

@SpringBootApplication 
public class So40491628Application { 

    public static void main(String[] args) throws Exception { 
     ConfigurableApplicationContext context = SpringApplication.run(So40491628Application.class, args); 
     Resource resource = new ClassPathResource("data.json"); 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     FileCopyUtils.copy(resource.getInputStream(), baos); 
     context.getBean(RabbitTemplate.class).send("foo", MessageBuilder.withBody(baos.toByteArray()) 
      .andProperties(MessagePropertiesBuilder.newInstance().setContentType("application/json").build()).build()); 
     Thread.sleep(10000); 
     context.close(); 
    } 

    @Bean 
    public Jackson2JsonMessageConverter converter() { 
     return new Jackson2JsonMessageConverter(); 
    } 

    @Bean 
    public Queue foo() { 
     return new Queue("foo"); 
    } 

    @RabbitListener(queues = "foo") 
    public void listen(List<Employee> emps) { 
     System.out.println(emps); 
    } 

    public static class Employee { 

     private String name; 

     private String age; 

     private int empId; 

     public String getName() { 
      return this.name; 
     } 

     public void setName(String name) { 
      this.name = name; 
     } 

     public String getAge() { 
      return this.age; 
     } 

     public void setAge(String age) { 
      this.age = age; 
     } 

     public int getEmpId() { 
      return this.empId; 
     } 

     public void setEmpId(int empId) { 
      this.empId = empId; 
     } 

     @Override 
     public String toString() { 
      return "Employee [name=" + this.name + ", age=" + this.age + ", empId=" + this.empId + "]"; 
     } 

    } 
} 

結果:

[Employee [name=Jasmine, age=24, empId=0], Employee [name=Mark, age=32, empId=0]] 

enter image description here

+0

お返事ありがとうございます。私はspring-boot-starter-amqp 1.4.1を使用しています。バージョン1.6.2のspring-rabbitを使用しています。 (どちらも最新です) – vin4yak

+0

サンプル入力jsonも追加されました。 – vin4yak

+0

ああ;あなたの設定は間違っています。あなたは 'Jackson2JsonMessageConverter'を使うべきです - 私は数分でアップデートを投稿します。 –

関連する問題