Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将消息直接绑定到我的对象类_Java_Spring Amqp_Spring Rabbit - Fatal编程技术网

Java 如何将消息直接绑定到我的对象类

Java 如何将消息直接绑定到我的对象类,java,spring-amqp,spring-rabbit,Java,Spring Amqp,Spring Rabbit,我得到的消息如下,其中包含2个HashMap(inputMap和outputMap)。使用ObjectMapper是正确的方法吗 示例消息: 在RabbitMQ中: {"ORCH_KEY":{"inputMap":{},"outputMap":{"activityId":"10001002","activityStatus":"SUCCESS"}}} 在配置代码中 SimpleRabbitListenerContainerFactory factory = new SimpleRabbitL

我得到的消息如下,其中包含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());
@RabbitListener(containerFactory=“adapterplistenercontainerfactory”,queues=Constants.adapter\u OP\u QUEUE)
public void handleAdapterQueueMessage(HashMap adapterOutputMap){
logger.info(“适配器处理程序:::”+this.getClass().getCanonicalName());
试一试{
info(“适配器输出映射:::::”+adapterOutputMap);
如果(adapterOutputMap.size()==1){
迭代器迭代器=adapterOutputMap.entrySet().Iterator();
Entry next=iterator.next();
字符串ORCH_KEY=next.getKey();
logger.info(“Ochestration键:::::”+ORCH_键);
ExchangeDTO ExchangeDTO=next.getValue();
logger.info(“OutputMap的大小::”+exchangeDTO.getOutputMap().Size());
换班

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;
}
public类ExchangeDTO实现可序列化{
/**
* 
*/
私有静态最终长serialVersionUID=1L;
私有HashMap inputMap=新HashMap();
私有HashMap outputMap=新HashMap();
公共HashMap getInputMap(){
返回inputMap;
}
公共void setInputMap(HashMap inputMap){
this.inputMap=inputMap;
}
公共HashMap getOutputMap(){
返回outputMap;
}
public void setOutputMap(HashMap outputMap){
this.outputMap=outputMap;
}
}

我面临如下错误:

无法将java.util.LinkedHashMap强制转换为 com.bosch.bip.dto.ExchangeDTO

“在java代码中”是什么意思?对象映射程序需要一个JSON字符串

{"ORCH_KEY":{"inputMap":{},"outputMap":{"activityId":"10001002","activityStatus":"SUCCESS"}}}
如果您使用的是Spring AMQP Json转换器,那么Json将已经被转换为映射的映射

{inputMap={}, outputMap={activityId=10001002, activityStatus=SUCCESS}}
看起来像是对结果的
toString()
调用

您需要使用定制的
类映射器来定制
Jackson2JsonMessageConverter
,该类映射器告诉转换器您希望创建一个
ExchangeDTO

您可以使用
DefaultClassMapper
;如果消息中没有用于确定类型的信息,则默认类映射器将返回到其默认类型:
myDefaultClassMapper.setDefaultType(MyType.class);
。然后将映射器注入消息转换器

编辑

我刚刚运行了一个测试,它对我来说运行得很好(注意,不需要定制类映射器)

这种机制(将参数类型传递给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();
}
您的映射值似乎没有转换为DTO,而是转换为默认的
LinkedHashMap
。如果您使用与我相同的配置,我看不出这有什么可能


如果您可以在某个地方发布一个显示问题的小测试项目,我可以看看有什么问题。

您是否正在尝试解析{inputMap={},outputMap={activityId=10001002,activityStatus=SUCCESS}错误地将其转换为JSON,错误似乎指向了这一点。你好,Gary,我现在面临以下异常。java.util.LinkedHashMap无法转换为com.bosch.bip.dto.ExchangedTo您使用的是哪个版本的Spring AMQP?请参阅我的编辑,您的用例对我来说很好。我使用的是1.6.1。我能够看到与您类似的输出。但问题出在哪里de>ExchangeDTO ExchangeDTO=next.getValue();
请参见我的第二次编辑。是否确实删除了自定义类映射器?我在添加ExchangeDTO后,缺少了对其进行
重写的功能。它开始工作了。是问题吗?我不确定
... Received message: (Body:'{"MAP":{"inputMap":{"foo":"bar"},"outputMap":{"baz":"qux"}}}'
Result:class java.util.HashMap:{MAP=DTO [inputMap={foo=bar}, outputMap={baz=qux}]}
@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}]