TypeIdPropertyName
是標識實體的屬性的名稱。傑克遜映射器在反序列化傳入的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「字段在您的消息。
似乎就是這樣解決了這個問題。謝謝。不知道爲什麼文檔和樣本沒有任何正確的解釋就有這樣一個有問題的方法。設置typeIdPropertyName的java文檔只是說消息的類型id屬性。它必須設置。但沒有說明應該如何設置。 – Imran