6

我正在尝试使用将 java 对象转换为 json 格式,mappingjackson2messageconvertor但看起来它没有转换为 json 对象,而是抛出空点异常错误。想知道我做错了什么。

我已经检查了此处的示例之一。但我没有使用rabbitmq,而不是使用activemq。

资源

@SpringBootApplication
@EnableJms
public class Application {
    @Bean
    JmsListenerContainerFactory<?> myJmsContainerFactory(ConnectionFactory connectionFactory) {
        SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        factory.setMessageConverter(new MappingJackson2MessageConverter());
        return factory;
    }


    public static void main(String[] args) {
        // Clean out any ActiveMQ data from a previous run
        FileSystemUtils.deleteRecursively(new File("activemq-data"));

        // Launch the application
        ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
        AssetApi asset = new AssetApi();
        asset.setBroadcasterId("test");
        asset.setNotes("test");

        // Send a message
        MessageCreator messageCreator = new MessageCreator() {
            @Override
            public Message createMessage(Session session) throws JMSException {
                MessageConverter message = new MappingJackson2MessageConverter();
                return message.toMessage(asset, session);
            }
        };
        JmsTemplate jmsTemplate = context.getBean(JmsTemplate.class);
        System.out.println("Sending a new message.");
        jmsTemplate.send("mailbox-destination", messageCreator);
    }
}

错误

java.lang.NullPointerException: null
    at org.apache.activemq.command.ActiveMQMessage.getStringProperty(ActiveMQMessage.java:676)
    at org.springframework.jms.support.converter.MappingJackson2MessageConverter.getJavaTypeForMessage(MappingJackson2MessageConverter.java:377)
    at org.springframework.jms.support.converter.MappingJackson2MessageConverter.fromMessage(MappingJackson2MessageConverter.java:195)
    at org.springframework.jms.listener.adapter.AbstractAdaptableMessageListener.extractMessage(AbstractAdaptableMessageListener.java:215)
    at org.springframework.jms.listener.adapter.AbstractAdaptableMessageListener$MessagingMessageConverterAdapter.extractPayload(AbstractAdaptableMessageListener.java:397)
    at org.springframework.jms.support.converter.MessagingMessageConverter.fromMessage(MessagingMessageConverter.java:108)
    at org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.toMessagingMessage(MessagingMessageListenerAdapter.java:77)
    at org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:62)
    at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:678)
    at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:638)
    at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:608)
    at org.springframework.jms.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:579)
    at org.springframework.jms.listener.SimpleMessageListenerContainer.processMessage(SimpleMessageListenerContainer.java:329)
    at org.springframework.jms.listener.SimpleMessageListenerContainer$2.onMessage(SimpleMessageListenerContainer.java:305)
    at org.apache.activemq.ActiveMQMessageConsumer.dispatch(ActiveMQMessageConsumer.java:1390)
    at org.apache.activemq.ActiveMQSessionExecutor.dispatch(ActiveMQSessionExecutor.java:131)
    at org.apache.activemq.ActiveMQSessionExecutor.iterate(ActiveMQSessionExecutor.java:202)
    at org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:133)
    at org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:48)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
4

4 回答 4

3

使用 JMS 转换器,您需要告诉转换器您想从 JSON 创建什么类型 (id)。

您可以通过告诉它哪个 JMS 属性(标题)包含类型 id)来做到这一点。

然后是Map从类型 ID 到类名。

或者您可以继承并覆盖getJavaTypeForMessage().

getJavaTypeForMessage()有关转换器的方法,请参见 javadoc 。

于 2015-09-03T21:30:46.627 回答
1

正如加里·拉塞尔(Gary Russell)在我的呼叫班上指出的那样,我做了

Map<String, Class<?>> typeIdMappings = new HashMap<String, Class<?>>();
typeIdMappings.put("JMSType",Audit.class);
mappingJackson2MessageConverter.setTypeIdMappings(typeIdMappings);
mappingJackson2MessageConverter.setTypeIdPropertyName("JMSType"); 
Audit audit = (Audit) mappingJackson2MessageConverter.fromMessage(message);

然后我覆盖了 MappingJackson2MessageConverter 的方法:

@Component
public class MecMappingJackson2MessageConverter extends MappingJackson2MessageConverter {

    private Map<String, Class<?>> idClassMappings = new HashMap<String, Class<?>>();

    private Map<Class<?>, String> classIdMappings = new HashMap<Class<?>, String>();

    private ObjectMapper objectMapper = new ObjectMapper();

    private ClassLoader beanClassLoader;

    @Override
    public JavaType getJavaTypeForMessage(Message message){

        Class<?> mappedClass = this.idClassMappings.get("JMSType");
    if (mappedClass != null) {
        return this.objectMapper.getTypeFactory().constructType(mappedClass);
    }
    try {
        Class<?> typeClass = ClassUtils.forName("JMSType", this.beanClassLoader);
            return this.objectMapper.getTypeFactory().constructType(typeClass);
        }
        catch (Throwable ex) {
            throw new MessageConversionException("Failed to resolve type id [" + "JMSType" + "]", ex);
        }

    }

    @Override
    public void setTypeIdMappings(Map<String, Class<?>> typeIdMappings) {
        this.idClassMappings = new HashMap<String, Class<?>>();
        for (Map.Entry<String, Class<?>> entry : typeIdMappings.entrySet()) {
            String id = entry.getKey();
            Class<?> clazz = entry.getValue();
        this.idClassMappings.put(id, clazz);
        this.classIdMappings.put(clazz, id);
    }
}

}

于 2015-09-11T21:09:28.907 回答
0

我已经创建了自己的反序列化器,并在我的 MappingJackson2MessageConverter 对象中设置了相同的值,如下所示

ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(WebResponse.class,new WebResponseDeserializer());
mapper.registerModule(module);
new MappingJackson2MessageConverter().setObjectMapper(mapper);

WebResponseDeserializer 扩展 com.fasterxml.jackson.databind.JsonDeserializer 以提供自定义解组我的 json 对象的方式

于 2016-03-14T05:45:30.387 回答
0

您只需要调用setTypeIdPropertyName您的消息转换器并为消息头传递所需的名称,其中消息转换器将保存您的 pojo 的类名。

于 2016-08-25T10:58:22.620 回答