调用dubbo接口报错:com.caucho.hessian.io.HessianProtocolException: unknown code for readObject at 0x3c (<)

1.问题现象

    今天在调用自己写的的dubbo接口报错:com.caucho.hessian.io.HessianProtocolException: unknown code for readObject at 0x3c (<),具体堆栈信息如下:

com.caucho.hessian.client.HessianRuntimeException: com.caucho.hessian.io.HessianFieldException: com.tuan.core.common.template.CallResult.resultObject: 
unknown code for readObject at 0x3c (<)
	at com.caucho.hessian.client.HessianProxy.invoke(HessianProxy.java:244) ~[hessian-2.0.1.jar:3.1.0]
	at com.sun.proxy.$Proxy29.statisticAllData(Unknown Source) ~[na:na]
	at com.alibaba.dubbo.common.bytecode.Wrapper12.invokeMethod(Wrapper12.java) ~[dubbo-2.5.4.20170613.jar:2.5.4.20170613]
	at com.alibaba.dubbo.rpc.proxy.javassist.JavassistProxyFactory$1.doInvoke(JavassistProxyFactory.java:46) ~[dubbo-2.5.4.20170613.jar:2.5.4.20170613]
	at com.alibaba.dubbo.rpc.proxy.AbstractProxyInvoker.invoke(AbstractProxyInvoker.java:72) ~[dubbo-2.5.4.20170613.jar:2.5.4.20170613]
	at com.alibaba.dubbo.rpc.protocol.AbstractProxyProtocol$2.doInvoke(AbstractProxyProtocol.java:93) ~[dubbo-2.5.4.20170613.jar:2.5.4.20170613]
	at com.alibaba.dubbo.rpc.protocol.AbstractInvoker.invoke(AbstractInvoker.java:144) ~[dubbo-2.5.4.20170613.jar:2.5.4.20170613]
	at com.alibaba.dubbo.rpc.listener.ListenerInvokerWrapper.invoke(ListenerInvokerWrapper.java:74) ~[dubbo-2.5.4.20170613.jar:2.5.4.20170613]
	at com.alibaba.dubbo.rpc.protocol.dubbo.filter.FutureFilter.invoke(FutureFilter.java:53) ~[dubbo-2.5.4.20170613.jar:2.5.4.20170613]
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:92) ~[dubbo-2.5.4.20170613.jar:2.5.4.20170613]
	at com.alibaba.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:75) ~[dubbo-2.5.4.20170613.jar:2.5.4.20170613]
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:92) ~[dubbo-2.5.4.20170613.jar:2.5.4.20170613]
	at com.alibaba.dubbo.rpc.filter.ConsumerContextFilter.invoke(ConsumerContextFilter.java:48) ~[dubbo-2.5.4.20170613.jar:2.5.4.20170613]
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:92) ~[dubbo-2.5.4.20170613.jar:2.5.4.20170613]
	at com.alibaba.dubbo.rpc.protocol.InvokerWrapper.invoke(InvokerWrapper.java:53) ~[dubbo-2.5.4.20170613.jar:2.5.4.20170613]
	at com.alibaba.dubbo.rpc.cluster.support.FailoverClusterInvoker.doInvoke(FailoverClusterInvoker.java:77) ~[dubbo-2.5.4.20170613.jar:2.5.4.20170613]
	at com.alibaba.dubbo.rpc.cluster.support.AbstractClusterInvoker.doGrayInvoke(AbstractClusterInvoker.java:241) ~[dubbo-2.5.4.20170613.jar:2.5.4.20170613]
	at com.alibaba.dubbo.rpc.cluster.support.AbstractClusterInvoker.invoke(AbstractClusterInvoker.java:227) ~[dubbo-2.5.4.20170613.jar:2.5.4.20170613]
	at com.alibaba.dubbo.rpc.proxy.InvokerInvocationHandler.invoke(InvokerInvocationHandler.java:52) ~[dubbo-2.5.4.20170613.jar:2.5.4.20170613]
	at com.alibaba.dubbo.common.bytecode.proxy12.statisticAllData(proxy12.java) ~[dubbo-2.5.4.20170613.jar:2.5.4.20170613]
	at com.yz.rainbowbridgewebcenter.web.controller.MonitorMapController.monitorMapStatistic(MonitorMapController.java:41) ~[classes/:na]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_45]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0_45]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_45]
	at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_45]
	at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215) [spring-web-3.2.12.RELEASE.jar:3.2.12.RELEASE]
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) [spring-web-3.2.12.RELEASE.jar:3.2.12.RELEASE]
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) [spring-webmvc-3.2.12.RELEASE.jar:3.2.12.RELEASE]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745) [spring-webmvc-3.2.12.RELEASE.jar:3.2.12.RELEASE]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:685) [spring-webmvc-3.2.12.RELEASE.jar:3.2.12.RELEASE]
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) [spring-webmvc-3.2.12.RELEASE.jar:3.2.12.RELEASE]
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:919) [spring-webmvc-3.2.12.RELEASE.jar:3.2.12.RELEASE]
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:851) [spring-webmvc-3.2.12.RELEASE.jar:3.2.12.RELEASE]
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:953) [spring-webmvc-3.2.12.RELEASE.jar:3.2.12.RELEASE]
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:855) [spring-webmvc-3.2.12.RELEASE.jar:3.2.12.RELEASE]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:650) [servlet-api.jar:na]
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829) [spring-webmvc-3.2.12.RELEASE.jar:3.2.12.RELEASE]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) [servlet-api.jar:na]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) [catalina.jar:7.0.78]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [catalina.jar:7.0.78]
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat7-websocket.jar:7.0.78]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) [catalina.jar:7.0.78]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [catalina.jar:7.0.78]
	at com.yz.rainbowbridgewebcenter.filter.SetLoginInfoFromIDCenterFilter.doFilter(SetLoginInfoFromIDCenterFilter.java:48) [classes/:na]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) [catalina.jar:7.0.78]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [catalina.jar:7.0.78]
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) [spring-web-3.2.12.RELEASE.jar:3.2.12.RELEASE]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:106) [spring-web-3.2.12.RELEASE.jar:3.2.12.RELEASE]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) [catalina.jar:7.0.78]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [catalina.jar:7.0.78]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:218) [catalina.jar:7.0.78]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110) [catalina.jar:7.0.78]
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506) [catalina.jar:7.0.78]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169) [catalina.jar:7.0.78]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) [catalina.jar:7.0.78]
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:962) [catalina.jar:7.0.78]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) [catalina.jar:7.0.78]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445) [catalina.jar:7.0.78]
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1115) [tomcat-coyote.jar:7.0.78]
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637) [tomcat-coyote.jar:7.0.78]
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316) [tomcat-coyote.jar:7.0.78]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_45]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [na:1.7.0_45]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-coyote.jar:7.0.78]
	at java.lang.Thread.run(Thread.java:744) [na:1.7.0_45]
Caused by: com.caucho.hessian.io.HessianFieldException: com.tuan.core.common.template.CallResult.resultObject: unknown code for readObject at 0x3c (<)
	at com.caucho.hessian.io.UnsafeDeserializer.logDeserializeError(UnsafeDeserializer.java:786) ~[hessian-2.0.1.jar:3.1.0]
	at com.caucho.hessian.io.UnsafeDeserializer$ObjectFieldDeserializer.deserialize(UnsafeDeserializer.java:423) ~[hessian-2.0.1.jar:3.1.0]
	at com.caucho.hessian.io.UnsafeDeserializer.readMap(UnsafeDeserializer.java:210) ~[hessian-2.0.1.jar:3.1.0]
	at com.caucho.hessian.io.UnsafeDeserializer.readMap(UnsafeDeserializer.java:116) ~[hessian-2.0.1.jar:3.1.0]
	at com.caucho.hessian.io.HessianInput.readObject(HessianInput.java:1035) ~[hessian-2.0.1.jar:3.1.0]
	at com.caucho.hessian.client.HessianProxy.invoke(HessianProxy.java:229) ~[hessian-2.0.1.jar:3.1.0]
	... 64 common frames omitted
Caused by: com.caucho.hessian.io.HessianProtocolException: unknown code for readObject at 0x3c (<)
	at com.caucho.hessian.io.HessianInput.error(HessianInput.java:1697) ~[hessian-2.0.1.jar:3.1.0]
	at com.caucho.hessian.io.HessianInput.readObject(HessianInput.java:1177) ~[hessian-2.0.1.jar:3.1.0]
	at com.caucho.hessian.io.CollectionDeserializer.readList(CollectionDeserializer.java:78) ~[hessian-2.0.1.jar:3.1.0]
	at com.caucho.hessian.io.SerializerFactory.readList(SerializerFactory.java:521) ~[hessian-2.0.1.jar:3.1.0]
	at com.caucho.hessian.io.HessianInput.readObject(HessianInput.java:1154) ~[hessian-2.0.1.jar:3.1.0]
	at com.caucho.hessian.io.HessianInput.readObject(HessianInput.java:1012) ~[hessian-2.0.1.jar:3.1.0]
	at com.caucho.hessian.io.UnsafeDeserializer$ObjectFieldDeserializer.deserialize(UnsafeDeserializer.java:419) ~[hessian-2.0.1.jar:3.1.0]
	... 68 common frames omitted


2.排查思路

  首先第一行看到com.caucho.hessian.client.HessianRuntimeException,这是个什么类,于是乎百度到结果,这里名词解释一下:

(1)Hessian:是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能。 

相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用的是二进制协议,

所以它很适合于发送二进制数据。


(2)RMI:远程方法调用(Remote Method Invocation),

具体可参考别人总结的CSDN博客:http://blog.csdn.net/a19881029/article/details/9465663


也就是说dubbo的远程调用方法的实现方式使用的Hessian框架,而我调用dubbo接口报的错是Hessian框架中的错误

于是乎奔着堆栈信息最下面的Caused by: com.caucho.hessian.io.HessianProtocolException: unknown code for readObject at 0x3c (<),一顿狂搜,依然没有解决问题;

后来在项目中跟别人写的dubbo接口做对比,一模一样;

再后来让同事帮着看了半天,最后发现:我写的返回结果List集合中的model对象原来没继承一个通用父类,看了下没啥特别的,就实现了Serializable接口和写了个toString,具体如下:

package com.tuan.core.common.lang;

import java.io.Serializable;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;

public abstract class TuanBaseDO
    implements Serializable
{

    public TuanBaseDO()
    {
    }

    public String toString()
    {
        try
        {
            return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
        }
        catch(Exception e)
        {
            return super.toString();
        }
    }
}

于是我让我返回的自定义业务对象实现Serializable接口,重新发布了下dubbo接口,再次调用,

竟然可以了,可见返回的对象必须实现Serializable接口。


3.解决方案

方案有两种:

(1)让你自定义的业务对象实现Serializable接口

(2)定义一个基类实现Serializable接口,你自定义的业务对象继承这个类。

我们项目中采用的是第二种,我个人更倾向于第一种,因为java中类继承只能继承一个,而接口可以实现多个。


4.拓展

如果遇到com.caucho.hessian.io.HessianProtocolException: unknown code for readObject at 0x3c (<),上面的方案解决不了,

也可以参照如下文章:

(1)com.caucho.hessian.io.HessianProtocolException: is unknown code 解决方案

(2)使用xxl-job调度平台时,启动执行器工程报错:unknown code for readObject at 0x3c (<)

(3)com.caucho.hessian.io.HessianProtocolException: is unknown code的错误 解决方案




  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值