今天尝试了一下Hessian与Spring的结合,选取版本为:hessian3.2.1;spring2.5。出现了莫名的异常如下:
com.caucho.hessian.io.HessianProtocolException: expected string at 0x6d
at com.caucho.hessian.io.Hessian2Input.error(Hessian2Input.java:2714)
at com.caucho.hessian.io.Hessian2Input.expect(Hessian2Input.java:2695)
at com.caucho.hessian.io.Hessian2Input.readString(Hessian2Input.java:1322)
at com.caucho.hessian.io.Hessian2Input.readMethod(Hessian2Input.java:267)
at com.caucho.hessian.server.HessianSkeleton.invoke(HessianSkeleton.java:138)
at com.caucho.hessian.server.HessianSkeleton.invoke(HessianSkeleton.java:110)
at org.springframework.remoting.caucho.Hessian2SkeletonInvoker.invoke(Hessian2SkeletonInvoker.java:94)
at org.springframework.remoting.caucho.HessianExporter.invoke(HessianExporter.java:142)
at org.springframework.remoting.caucho.HessianServiceExporter.handleRequest(HessianServiceExporter.java:70)
at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:49)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:875)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:511)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)
在网上搜索了以后,发现是spring2.0.7之后对客户端请求协议的处理发生了变化导致的。引用:
It has been like that since Spring 2.0.7. Means regardless in which protocol (hessian 1 or hessian 2) that the client requests,
the Hessian2Input will always be used if the class is available in the classpath. It's still quite abnormal to me
Nevertheless, I found that the problem comes from hessian 3.2.1. In that version, Hessian2Input does not understand hessian 1 input!
So, my solution is to use the earlier version: 3.1.6. It works!
I noticed that hessian 3.2.1 (and 3.2.0) was delivered without the hessian-test.jar. It probably was not tested, that may cause the problem :-)
所以,更换为hessian3.1.6就解决了。