com.alibaba.com.caucho.hessian.io.HessianFieldException: XxxDTO#xxfield: com.alibaba.com.caucho.hessian.io.StringValueDeserializer: unexpected object java.lang.String

发布时间 2023-04-19 21:17:14作者: buguge

昨晚例行上线后,今天早上生产发现一个bug。

什么bug呢?先看下面的dubbo接口

List<TaskDTO> listTask(TaskQuery query);

其中,TaskDTO里有个field叫price。这次上线时,我们一个小伙把price的数据类型由String改为BigDecimal了。

不巧的是,上线时漏掉了一个消费者,服务未重启。今天上午系统在使用时,出现了如下Exception。---->com.alibaba.com.caucho.hessian.io.HessianFieldException: com.emax.sale.comingparts.TaskDTO.price: com.alibaba.com.caucho.hessian.io.StringValueDeserializer: unexpected object java.lang.String (200)

 

我之前写过Hessian2序列化的工具类。https://www.cnblogs.com/buguge/p/16988123.html  用其中的testcase很容易复现这个情况。 --->

 --->如果不给TaskDTO#price赋值,即默认值为null,则修改其类型String→BigDecimal时,不会有影响。

 --->当一旦给TaskDTO#price赋值了,那么在修改其类型String→BigDecimal后,反序列化就会抛出这个HessianFieldException-unexpected object java.lang.String。

 

如下是跑testcase关于这个HessianFieldException-unexpected object java.lang.String的详细异常堆栈。

com.alibaba.com.caucho.hessian.io.HessianFieldException: dubbodemo.dto.MyDto1.price: com.alibaba.com.caucho.hessian.io.StringValueDeserializer: unexpected object java.lang.String (200)

    at com.alibaba.com.caucho.hessian.io.JavaDeserializer.logDeserializeError(JavaDeserializer.java:167)
    at com.alibaba.com.caucho.hessian.io.JavaDeserializer$ObjectFieldDeserializer.deserialize(JavaDeserializer.java:410)
    at com.alibaba.com.caucho.hessian.io.JavaDeserializer.readObject(JavaDeserializer.java:276)
    at com.alibaba.com.caucho.hessian.io.JavaDeserializer.readObject(JavaDeserializer.java:203)
    at com.alibaba.com.caucho.hessian.io.SerializerFactory.readObject(SerializerFactory.java:532)
    at com.alibaba.com.caucho.hessian.io.Hessian2Input.readObjectInstance(Hessian2Input.java:2820)
    at com.alibaba.com.caucho.hessian.io.Hessian2Input.readObject(Hessian2Input.java:2743)
    at com.alibaba.com.caucho.hessian.io.Hessian2Input.readObject(Hessian2Input.java:2278)
    at com.alibaba.com.caucho.hessian.io.Hessian2Input.readObject(Hessian2Input.java:2717)
    at com.alibaba.com.caucho.hessian.io.Hessian2Input.readObject(Hessian2Input.java:2278)
    at dubbodemo.consumer.Hessian2SerializationUtil.deserialize(Hessian2SerializationUtil.java:47)
    at dubbodemo.consumer.Hessian2SerializationTest.testDeSerialize(Hessian2SerializationTest.java:33)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
    at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
    at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)
Caused by: com.alibaba.com.caucho.hessian.io.HessianProtocolException: com.alibaba.com.caucho.hessian.io.StringValueDeserializer: unexpected object java.lang.String (200)
    at com.alibaba.com.caucho.hessian.io.AbstractDeserializer.error(AbstractDeserializer.java:131)
    at com.alibaba.com.caucho.hessian.io.AbstractDeserializer.readObject(AbstractDeserializer.java:70)
    at com.alibaba.com.caucho.hessian.io.Hessian2Input.readObject(Hessian2Input.java:2267)
    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)
    ... 32 more