Stomp与Jackson

  读取Stomp消息的类在StompDecoder中,org.springframework.messaging.simp.stomp.StompDecoder。

  Jackson把json转对象是在如下步骤中:

  1、org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolverComposite类中的resolveArgument(MethodParameter parameter, Message<?> message)方法,返回Object

  2、org.springframework.messaging.handler.annotation.support.PayloadArgumentResolver类中的resolveArgument(MethodParameter parameter, Message<?> message)方法中的Object target = this.converter.fromMessage(message, targetClass);

  3、调用org.springframework.messaging.converter.CompositeMessageConverter类的fromMessage(Message<?> message, Class<?> targetClass)方法,遍历本类中的所有converters,找到合适的结果并返回。

  4、调用org.springframework.messaging.converter.AbstractMessageConverter类中的fromMessage(Message<?> message, Class<?> targetClass)中的convertFromInternal(message, targetClass);方法

  5、convertFromInternal(message, targetClass);方法在org.springframework.messaging.converter.MappingJackson2MessageConverter中实例化(PS:也可以使用其他convert,只要spring支持即可):

public Object convertFromInternal(Message<?> message, Class<?> targetClass) {
        JavaType javaType = this.objectMapper.constructType(targetClass);
        Object payload = message.getPayload();//这里可以看到取消息字节流
        try {
            if (payload instanceof byte[]) {
                return this.objectMapper.readValue((byte[]) payload, javaType);//这里是转换的核心
            }
            else {
                return this.objectMapper.readValue((String) payload, javaType);
            }
        }
        catch (IOException ex) {
            throw new MessageConversionException(message, "Could not read JSON: " + ex.getMessage(), ex);
        }
    }

  6、从这里开始调用fasterxml.jackson包对数据进行绑定。

  默认对json绑定到map,如果有对象的话则会把map转为对象。

原文地址:https://www.cnblogs.com/guangshan/p/4462934.html