发现运行时会报错误, Object is not a primitive:

在开发过程中出现了"发现运行时会报错误, Object is not a primitive: "的异常,开始以为该实体对象没有实现序列化,打开实体看后,发现已经实现了,后来发现是在MQ的配置中,将实体写入到数据库才会出现这个异常,如果不写入到数据库,则不会;配置如下:

<amq:broker useJmx="false" persistent="true">
  <amq:persistenceAdapter>
   <amq:jdbcPersistenceAdapter id="jdbcAdapter"
    dataSource="#dataSource" createTablesOnStartup="true"
    useDatabaseLock="false" />
   <!-- Mysql can setup useDatabaseLock="true",this is defualt HSQLDB,MSSQL
    plz setup useDatabaseLock="false", if u setup useDatabaseLock="true",u will
    catch error: MSSQL Error Info:FOR UPDATE clause allowed only for DECLARE
    CURSOR HSQLDB Error Info:FOR in statement [SELECT * FROM ACTIVEMQ_LOCK FOR
    UPDATE] see http://www.nabble.com/ActiveMQ-JDBC-Persistence-with-SQL-Server-tf2022248.html#a5560296 -->
  </amq:persistenceAdapter>
  <amq:transportConnectors>
   <amq:transportConnector uri="tcp://localhost:0" />
  </amq:transportConnectors>
 </amq:broker>

 

解决方法为:改写MessageConverter类中的实现方法,通过ObjectOutputStream流来进行处理!方法如下:

 

public Message toMessage(Object obj, Session session) throws JMSException {
  // check Type
  if (obj instanceof IPAddressInfo) {
   ActiveMQObjectMessage objMsg = (ActiveMQObjectMessage) session
     .createObjectMessage();
   Map<String, byte[]> map = new HashMap<String, byte[]>();
   byte[] bytes = null;
   ByteArrayOutputStream buf = null;
   ObjectOutputStream o = null;
   try {
    buf = new ByteArrayOutputStream();
    o = new ObjectOutputStream(buf);
    o.writeObject(obj);
    bytes = buf.toByteArray();
   } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } finally {
    if (o != null) {
     try {
      o.flush();
      o.close();
     } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
    }
    if (buf != null) {
     try {
      buf.flush();
      buf.close();
     } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
    }
   }
   map.put("Order", bytes);
   objMsg.setObjectProperty("Map", map);
   return objMsg;
  } else {
   throw new JMSException("Object:[" + obj + "] is not Order");
  }

 }

 /*
  * (non-Javadoc)
  *
  * @see
  * org.springframework.jms.support.converter.MessageConverter#fromMessage
  * (javax.jms.Message)
  */
 public Object fromMessage(Message msg) throws JMSException {
  if (msg instanceof ObjectMessage) {
   if (msg != null) {
    Object obj = null;
    byte[] bytes = (byte[]) ((Map) ((ObjectMessage) msg)
      .getObjectProperty("Map")).get("Order");
    ObjectInputStream in = null;
    try {
     in = new ObjectInputStream(new ByteArrayInputStream(bytes));
     obj = in.readObject();
    } catch (Exception e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    } finally {
     if (in != null) {
      try {
       in.close();
      } catch (IOException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      }
     }
    }
    return obj;
   }
  }
  return msg;
 }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值