om.alibaba.com.caucho.hessian.io.HessianProtocolException: com.alibaba.com.caucho.hessian.io.ObjectDeserializer: unexpected object java.lang.String (CU) 調用dubbo返回這個錯誤


方法一:

 本人為調用dubbo 接口,返回一個HashMap<Object,List<Student>>對象, 在反序列化map的時候出現問題,

 解決方法為 把返回的對象封裝成對象 再返回

方法二: 人家提供的一個方法

傳輸的數據為

@Data public class ResultBean implements Serializable { private static final long serialVersionUID = 7316712281088805027L; /** * 返回標識 正常返回為正數 異常為負數 */ private Integer code; /** * 返回文字描述 */ private String message; /** * 返回數據 */ private Serializable result; public ResultBean() { } public ResultBean(Integer code, String message) { this.code = code; this.message = message; } public ResultBean(Integer code, String message, Serializable result) { this.code = code; this.message = message; this.result = result; } } 

dubbo provider 代碼

    @Override
    public ResultBean resultBean() { HashMap<String, Object> map = new HashMap<>(); map.put("username", "xiaoyong"); return new ResultBean(1, "hello world", map); } 

dubbo consumer 調用resultBean 時 會報一下錯誤

Caused by: com.alibaba.com.caucho.hessian.io.HessianProtocolException: com.alibaba.com.caucho.hessian.io.ObjectDeserializer: unexpected object java.lang.String (username) at com.alibaba.com.caucho.hessian.io.AbstractDeserializer.error(AbstractDeserializer.java:131) at com.alibaba.com.caucho.hessian.io.AbstractDeserializer.readMap(AbstractDeserializer.java:111) at com.alibaba.com.caucho.hessian.io.AbstractDeserializer.readMap(AbstractDeserializer.java:119) at com.alibaba.com.caucho.hessian.io.Hessian2Input.readObject(Hessian2Input.java:2093) at com.alibaba.com.caucho.hessian.io.Hessian2Input.readObject(Hessian2Input.java:2074) at com.alibaba.com.caucho.hessian.io.JavaDeserializer$ObjectFieldDeserializer.deserialize(JavaDeserializer.java:406) 

原因是 ObjectDeserializer這個類沒有實現readMap方法 解決方法 重寫 ObjectDeserializer

package com.alibaba.com.caucho.hessian.io; import java.io.IOException; public class ObjectDeserializer extends AbstractDeserializer { private Class _cl; private MapDeserializer mapDeserializer; // 新加的代碼 public ObjectDeserializer(Class cl) { _cl = cl; mapDeserializer = new MapDeserializer(cl); // 新加的代碼 } /** 新加的代碼 begin */ @Override public Object readMap(AbstractHessianInput in) throws IOException { return readMap(in, null, null); } @Override public Object readMap(AbstractHessianInput in, Class<?> expectKeyType, Class<?> expectValueType) throws IOException { return this.mapDeserializer.readMap(in, expectKeyType, expectValueType); } /** 新加的代碼 end */ @Override public Class getType() { return _cl; } @Override public Object readObject(AbstractHessianInput in) throws IOException { return in.readObject(); } @Override public Object readObject(AbstractHessianInput in, String[] fieldNames) throws IOException { throw new UnsupportedOperationException(String.valueOf(this)); } @Override public Object readList(AbstractHessianInput in, int length) throws IOException { throw new UnsupportedOperationException(String.valueOf(this)); } @Override public Object readLengthList(AbstractHessianInput in, int length) throws IOException { throw new UnsupportedOperationException(String.valueOf(this)); } @Override public String toString() { return getClass().getSimpleName() + "[" + _cl + "]";


參考鏈接:https://www.jianshu.com/p/9ac316fae3ae


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM