TypeIdPropertyName
是标识实体的属性的名称。Jackson 映射器应该知道在反序列化传入的 JSON 时使用什么实体。
请求应如下所示:
{
"_type" : "hello.Email",
"to" : "Imran",
"from" : "dzatorsky"
}
顺便说一句,我认为这不是最好的解决方案,因为 JMS 已经知道要使用什么类型(您在方法中声明它)。另一个缺点是您在消息中指定实体和包的名称,这将难以维护(每次更改包或实体名称都会很痛苦)。
这是更强大的配置:
@EnableJms
@Configuration
public class JmsListenerConfig implements JmsListenerConfigurer {
@Bean
public DefaultMessageHandlerMethodFactory handlerMethodFactory() {
DefaultMessageHandlerMethodFactory factory = new DefaultMessageHandlerMethodFactory();
factory.setMessageConverter(messageConverter());
return factory;
}
@Bean
public MessageConverter messageConverter() {
return new MappingJackson2MessageConverter();
}
@Override
public void configureJmsListeners(JmsListenerEndpointRegistrar registrar) {
registrar.setMessageHandlerMethodFactory(handlerMethodFactory());
}
}
此外,如果您使用 Spring JmsTemplate 发送消息,您可以将此组件添加到您的配置中:
/**
* Used to convert JMS messages from/to JSON. Registered in Spring-JMS automatically via auto configuration
*/
@Component
public class JsonMessageConverter implements MessageConverter {
@Autowired
private ObjectMapper mapper;
/**
* Converts message to JSON. Used mostly by {@link org.springframework.jms.core.JmsTemplate}
*/
@Override
public javax.jms.Message toMessage(Object object, Session session) throws JMSException, MessageConversionException {
String json;
try {
json = mapper.writeValueAsString(object);
} catch (Exception e) {
throw new MessageConversionException("Message cannot be parsed. ", e);
}
TextMessage message = session.createTextMessage();
message.setText(json);
return message;
}
/**
* Extracts JSON payload for further processing by JacksonMapper.
*/
@Override
public Object fromMessage(javax.jms.Message message) throws JMSException, MessageConversionException {
return ((TextMessage) message).getText();
}
}
使用此配置,您可以跳过消息中烦人的“_type”字段。