2016-09-24 78 views
1

我得到如下所示的消息,其中包含2個HashMap(inputMap和outputMap)。這是使用ObjectMapper的正確方法嗎?如何將消息直接綁定到我的對象類

示例消息:

在RabbitMQ的:

{"ORCH_KEY":{"inputMap":{},"outputMap":{"activityId":"10001002","activityStatus":"SUCCESS"}}} 

在配置代碼

SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); 
    factory.setConnectionFactory(connectionFactory()); 

    Jackson2JsonMessageConverter messageConverter=new Jackson2JsonMessageConverter(); 
    DefaultClassMapper classMapper = new DefaultClassMapper(); 
    classMapper.setDefaultType(ExchangeDTO.class); 
    messageConverter.setClassMapper(classMapper); 
    factory.setMessageConverter(messageConverter); 

消費者法典

@RabbitListener(containerFactory = "adapterOPListenerContainerFactory", queues = Constants.ADAPTOR_OP_QUEUE) 
    public void handleAdapterQueueMessage(HashMap<String, ExchangeDTO> adapterOutputMap) { 

     logger.info("Adapter Handler::::::::::"+this.getClass().getCanonicalName()); 
     try { 

      logger.info("Adapter Output Map:::::::::::" + adapterOutputMap); 

      if(adapterOutputMap.size()==1){ 
       Iterator<Entry<String, ExchangeDTO>> iterator = adapterOutputMap.entrySet().iterator(); 
       Entry<String, ExchangeDTO> next = iterator.next(); 

       String ORCH_KEY =next.getKey(); 
       logger.info("Ochestration Key:::::::::::" + ORCH_KEY); 

       ExchangeDTO exchangeDTO = next.getValue(); 
       logger.info("Size of OutputMap:::::"+exchangeDTO.getOutputMap().size()); 

ExchangeDTO類

public class ExchangeDTO implements Serializable { 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 
private HashMap<String, Object> inputMap = new HashMap<String, Object>(); 
private HashMap<String, Object> outputMap = new HashMap<String, Object>(); 

public HashMap<String, Object> getInputMap() { 
    return inputMap; 
} 

public void setInputMap(HashMap<String, Object> inputMap) { 
    this.inputMap = inputMap; 
} 

public HashMap<String, Object> getOutputMap() { 
    return outputMap; 
} 

public void setOutputMap(HashMap<String, Object> outputMap) { 
    this.outputMap = outputMap; 
} 

}

我面臨着這樣的錯誤如下:

java.util.LinkedHashMap中不能轉換到 com.bosch.bip.dto.ExchangeDTO

+0

您是否試圖錯誤地將{inputMap = {},outputMap = {activityId = 10001002,activityStatus = SUCCESS}}解析爲JSON,錯誤似乎指向了這一點。 – Ironluca

回答

1

「在java代碼中」是什麼意思?對象映射器期待JSON字符串。

{"ORCH_KEY":{"inputMap":{},"outputMap":{"activityId":"10001002","activityStatus":"SUCCESS"}}} 

如果您使用的是Spring AMQP的Json變頻器,JSON將已經被轉換成一個Map地圖。

{inputMap={}, outputMap={activityId=10001002, activityStatus=SUCCESS}} 

看起來像是一個toString()調用結果。

您需要自定義Jackson2JsonMessageConverter自定義ClassMapper告訴轉換器你想要一個ExchangeDTO創建。

您可以使用DefaultClassMapper;如果消息中沒有信息來確定類型,默認類映射器將回退到默認類型:myDefaultClassMapper.setDefaultType(MyType.class);。然後將映射器注入消息轉換器。

編輯

我只是跑測試和它的工作對我蠻好(注意,沒有classmapper的定製是必需的)...

public static class DTO { 

    private Map<String, Object> inputMap; 

    private Map<String, Object> outputMap; 

    public Map<String, Object> getInputMap() { 
     return this.inputMap; 
    } 

    public void setInputMap(Map<String, Object> inputMap) { 
     this.inputMap = inputMap; 
    } 

    public Map<String, Object> getOutputMap() { 
     return this.outputMap; 
    } 

    public void setOutputMap(Map<String, Object> outputMap) { 
     this.outputMap = outputMap; 
    } 

    @Override 
    public String toString() { 
     return "DTO [inputMap=" + this.inputMap + ", outputMap=" + this.outputMap + "]"; 
    } 

} 

@RabbitListener(queues = QUEUE, containerFactory = "adapterOPListenerContainerFactory") 
public void listen(HashMap<String, DTO> message) { 
    System.out.println("Result:" + message.getClass() + ":" + message); 
    latch.countDown(); 
} 

@Bean 
public SimpleRabbitListenerContainerFactory adapterOPListenerContainerFactory(ConnectionFactory connectionFactory) { 
    SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); 
    factory.setConnectionFactory(connectionFactory); 
    factory.setMessageConverter(new Jackson2JsonMessageConverter()); 
    return factory; 
} 

... Received message: (Body:'{"MAP":{"inputMap":{"foo":"bar"},"outputMap":{"baz":"qux"}}}' 

and

Result:class java.util.HashMap:{MAP=DTO [inputMap={foo=bar}, outputMap={baz=qux}]} 

此機制(將參數類型傳遞給JSON轉換器)需要Spring AMQP 1.6或更高版本 - 1.6.2是當前版本。

EDIT2

它工作正常,我...

@RabbitListener(queues = QUEUE, containerFactory = "adapterOPListenerContainerFactory") 
public void listen(HashMap<String, DTO> dtos) { 
    System.out.println("Result:" + dtos.getClass() + ":" + dtos); 
    DTO dto = dtos.entrySet().iterator().next().getValue(); 
    System.out.println(dto); 
    latch.countDown(); 
} 

Result:class java.util.HashMap:{MAP=DTO [inputMap={foo=bar}, outputMap={baz=qux}]} 
DTO [inputMap={foo=bar}, outputMap={baz=qux}] 

好像你的地圖值不被轉換爲DTO,而是默認LinkedHashMap。如果您使用與我相同的配置,我不會看到這是可能的。

如果您可以在展示問題的地方發佈一個小型測試項目,我可以看看有什麼不對。

+0

你好加里,我現在面臨異常。 ** java.util.LinkedHashMap不能轉換爲com.bosch.bip.dto.ExchangeDTO ** – Chandan

+0

您使用的是什麼版本的Spring AMQP?看到我的編輯,你的用例對我來說工作得很好。 –

+0

我正在使用1.6.1。我能夠看到類似於你的輸出。但問題是'ExchangeDTO exchangeDTO = next.getValue();' – Chandan

相關問題