环境
rabbitmq使用,传输对象与本地对象转换赋值;BeanUtils.copyProperties
只有属性(类型、名)一致才能赋值
public static Classes pt2Classes(ClassesPT classesPT) {
Classes classes = new Classes();
try {
BeanUtils.copyProperties(classes, classesPT);
// 不加判断,报空指针异常
if (null != classesPT.getClassId()) {
classes.setClassId(classesPT.getClassId().toString());
}
if (null != classesPT.getLineTypeid()) {
classes.setLineTypeid(classesPT.getLineTypeid().intValue());
}
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
return classes;
}
异常
org.apache.commons.beanutils.ConversionException: No value specified for 'Date'
at org.apache.commons.beanutils.converters.AbstractConverter.handleMissing(AbstractConverter.java:310)
at org.apache.commons.beanutils.converters.AbstractConverter.convert(AbstractConverter.java:136)
at org.apache.commons.beanutils.converters.ConverterFacade.convert(ConverterFacade.java:60)
at org.apache.commons.beanutils.BeanUtilsBean.convert(BeanUtilsBean.java:1078)
at org.apache.commons.beanutils.BeanUtilsBean.copyProperty(BeanUtilsBean.java:437)
at org.apache.commons.beanutils.BeanUtilsBean.copyProperties(BeanUtilsBean.java:286)
at org.apache.commons.beanutils.BeanUtils.copyProperties(BeanUtils.java:137)
at cn.iot.utils.BeanCopy.pt2Classes(BeanCopy.java:90)
at cn.iot.filter.ClassConsumer.onMessage(ClassConsumer.java:41)
at org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter.onMessage(MessageListenerAdapter.java:273)
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1569)
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1488)
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1476)
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:1467)
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1411)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:958)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:908)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1600(SimpleMessageListenerContainer.java:81)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.mainLoop(SimpleMessageListenerContainer.java:1279)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1185)
at java.lang.Thread.run(Thread.java:745)
原因
Date转换器没有注册到默认值,根据异常,查看报错点代码。
解决
ConvertUtils.register(new DateConverter(null), java.util.Date.class);
BeanUtils.copyProperties(classes, classesPT);
或
// 静态代码块
static{
ConvertUtils.register(new DateConverter(null),java.util.Date.class);
ConvertUtils.register(new SqlDateConverter(null), java.sql.Date.class);
}
改后代码
public static Classes pt2Classes(ClassesPT classesPT) {
Classes classes = new Classes();
try {
// 添加不报异常
ConvertUtils.register(new DateConverter(null), java.util.Date.class);
BeanUtils.copyProperties(classes, classesPT);
// 不加判断,报空指针异常
if (null != classesPT.getClassId()) {
classes.setClassId(classesPT.getClassId().toString());
}
if (null != classesPT.getLineTypeid()) {
classes.setLineTypeid(classesPT.getLineTypeid().intValue());
}
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
return classes;
}
return classes;
}