spring Jackson2ObjectMapperFactoryBean 和org.springframework.http.converter.json.MappingJackson2HttpMessageConverter
springmvc-servlet.xml
<mvc:annotation-driven validator="validator"> <mvc:message-converters> <bean class="org.springframework.http.converter.BufferedImageHttpMessageConverter" /> <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" /> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/plain;charset=UTF-8</value> <value>text/html;charset=UTF-8</value> </list> </property> </bean> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" id="MappingJackson2HttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>application/json; charset=UTF-8</value> <value>application/x-www-form-urlencoded; charset=UTF-8</value> <value>multipart/form-data; charset=UTF-8</value> </list> </property> <property name="objectMapper"> <bean class="com.yonyou.dmsgms.framework.filter.XssObjectMappper" id="XssObjectMappper"/> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>
msg_vehicle.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xmlns:rabbit="http://www.springframework.org/schema/rabbit" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit.xsd"> <beans profile="source"> <bean id="jsonFactory" class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"> <property name="failOnEmptyBeans" value="false"/> <property name="indentOutput" value="true"/> <property name="dateFormat"> <bean class="java.text.SimpleDateFormat"> <constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss"/> </bean> </property> <property name="featuresToDisable"> <array> <value type="com.fasterxml.jackson.databind.DeserializationFeature">FAIL_ON_UNKNOWN_PROPERTIES</value> </array> </property> </bean> <bean class="com.yonyou.f4.common.msg.impl.TopicProducerImpl" init-method="init"> <property name="connectionFactory" ref="rabbitmq_cf"/> <property name="objectMapper" ref="jsonFactory"/> <property name="topics"> <set> <value>topic.dms.vehicle</value> <value>dcs.interface</value> <value>dcs.factoryBase</value> </set> </property> </bean> </beans> <beans profile="source"> <bean class="com.yonyou.f4.common.msg.impl.TopicConsumerImpl" init-method="init" destroy-method="destroy"> <property name="connectionFactory" ref="rabbitmq_cf"/> <property name="objectMapper" ref="jsonFactory"/> <property name="maxThreads" value="10"/> <property name="queues"> <map> <entry key="test.dms.vehicle"> <map> <entry key="dcs.factoryBase" value="dcs.factoryBase.pdiCheck"/> <entry key="dcs.interface" value="dcs.intf.vehicle;dcs.intf.vehBack;dcs.intf.vehicle.test"/> <entry key="topic.dms.vehicle" value="dms.testdate"/> </map> </entry> </map> </property> <property name="handlers"> <map> <entry key="dcs.factoryBase.pdiCheck"> <bean class="com.yonyou.dmsgms.vehicle.controller.msg.PDICheckController"/> </entry> <entry key="dcs.intf.vehicle"> <bean class="com.yonyou.dmsgms.vehicle.controller.msg.VehicleShipController"/> </entry> <entry key="dcs.intf.vehBack"> <bean class="com.yonyou.dmsgms.vehicle.controller.msg.ReturnVehicleOrderController"/> </entry> <entry key="dms.testdate"> <bean class="com.yonyou.dmsgms.vehicle.controller.msg.TestDateMsgController"/> </entry> </map> </property> </bean> </beans> </beans>
发送消息
@RequestMapping(value = "/msg/topic/sendDate/tmtask") public ResponseEntity<VehShipVO> sendDate() { try { VehShipVO vo = new VehShipVO(); Date now = new Date(); vo.setShipDate(now); vo.setAscCode("test1"); vo.setChangedAt(Long.valueOf(now.getTime())); topicProducer.sendMsg("topic.dms.vehicle", "dms.testdate", vo); return new ResponseEntity<VehShipVO>(vo, HttpStatus.OK); }catch (Throwable t) { logger.error(t.getMessage(), t); return new ResponseEntity<VehShipVO>(HttpStatus.INTERNAL_SERVER_ERROR); } }
接收消息
public class TestDateMsgController extends TopicMsgHandler { private static final Logger logger = LoggerFactory.getLogger(TestDateMsgController.class); public int process() { try { Map msg = getMsgObj(Map.class); logger.debug("msg ===:" + msg); VehShipVO vo = getMsgObj(VehShipVO.class); logger.debug("vo date ===:" + vo.getShipDate()); } catch (Exception e) { logger.error("error:" + e.getMessage(), e); return -1; } return 1; } @Override public Exception getException() { return null; } }
结果:
10:48:22.997 [SimpleAsyncTaskExecutor-1] DEBUG - com.yonyou.dmsgms.vehicle.controller.msg.TestDateMsgController.process(TestDateMsgController.java:50) - msg ===:{vehVO=null, orderNo=null, ascCode=test1, shipDate=2017-08-09 10:48:22, changedAt=1502246902772, companyCode=null, companyName=null}
10:48:23.210 [SimpleAsyncTaskExecutor-1] DEBUG - com.yonyou.dmsgms.vehicle.controller.msg.TestDateMsgController.process(TestDateMsgController.java:54) - vo date ===:Wed Aug 09 10:48:22 CST 2017
10:48:23.219 [SimpleAsyncTaskExecutor-1] INFO - com.yonyou.f4.common.msg.impl.TopicMsgListener.onMessage(TopicMsgListener.java:71) - handler:[TestDateMsgController] process [dms.testdate]#[657554f9-f996-4d6e-bdb0-b7ba5d6104ac] ===> Success.
fleetInfoPO.setTimestamp("ENABLE_DATE", fleetinfoVO.getEnableDate());//报备有效期
mysql数据库
如果把msg.xml中json 日期format的注释
14:18:45.805 [SimpleAsyncTaskExecutor-1] DEBUG - com.yonyou.dmsgms.vehicle.controller.msg.TestDateMsgController.process(TestDateMsgController.java:50) - msg ===:{vehVO=null, orderNo=null, ascCode=test1, shipDate=1502259525519, changedAt=1502259525519, companyCode=null, companyName=null}
14:18:46.007 [SimpleAsyncTaskExecutor-1] DEBUG - com.yonyou.dmsgms.vehicle.controller.msg.TestDateMsgController.process(TestDateMsgController.java:54) - vo date ===:Wed Aug 09 14:18:45 CST 2017
14:18:46.020 [SimpleAsyncTaskExecutor-1] INFO - com.yonyou.f4.common.msg.impl.TopicMsgListener.onMessage(TopicMsgListener.java:71) - handler:[TestDateMsgController] process [dms.testdate]#[fc7989d7-53fc-4b73-9025-79f183af1298] ===> Success.
试验结果:发出的消息是long型的日期,收到vo的date类型数据自动转换成正常的日期+时间 Wed Aug 09 14:18:45 CST 2017,且vo中date的没有加注解