hessian 协议 版本 兼容
环境 :
服务端: hessian 4.0.38 , spring 4.3.6 ; spring文档指出spring4.0以上的版本只能使用hessian 4.0以上的版本
客户端: hessian3.1.5
异常 :
服务端没有异常 ,客户端请求服务端抛出以下异常,无法获取请求结果。
Caused by : com.caucho.hessian.io.HessianProtocolException: expected hessian reply at 0x48 (H) at com.caucho.hessian.io.Hessian2Input.error(Hessian2Input.java:2701) at com.caucho.hessian.io.Hessian2Input.startReply(Hessian2Input.java:405) at com.caucho.hessian.client.HessianProxy.invoke(HessianProxy.java:218)
分析 : 从异常可以看出服务端使用的是hessian2协议(Hessian2Input可以看出) ,客户端使用hessian1协议无法解析结果。
处理 : 让服务端和客户端使用同一版本的jar包;不能换包可以使用一下方法,重写org.springframework.remoting.caucho.HessianServiceExporter的doInvoke方法,实例如下:
import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.remoting.caucho.HessianServiceExporter; import com.caucho.hessian.io.AbstractHessianInput; import com.caucho.hessian.io.AbstractHessianOutput; import com.caucho.hessian.io.Hessian2Input; import com.caucho.hessian.io.Hessian2Output; import com.caucho.hessian.io.HessianInput; import com.caucho.hessian.io.HessianOutput; import com.caucho.hessian.server.HessianSkeleton; public class ExporterService extends HessianServiceExporter { // 是否使用hessian2协议 private boolean enableHessian2; public boolean isEnableHessian2() { return enableHessian2; } public void setEnableHessian2(boolean enableHessian2) { this.enableHessian2 = enableHessian2; } @Override public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 可以进行权限拦截 super.handleRequest(request, response); } @Override protected void doInvoke(HessianSkeleton skeleton, InputStream is, OutputStream os) throws Throwable { // 使用 hessian1协议 AbstractHessianInput in = new HessianInput(is); AbstractHessianOutput out = new HessianOutput(os); // 使用hessian2协议 if (isEnableHessian2()) { in = new Hessian2Input(is); out = new Hessian2Output(os); } skeleton.invoke(in, out); } }
参考 : http://blog.csdn.net/chjttony/article/details/6567511