a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 375|回复: 0

[专业语言] Java认证:小小试Hessian实现webservice

[复制链接]
发表于 2012-8-4 12:44:44 | 显示全部楼层 |阅读模式
Java认证:小小试Hessian实现webservice
  S. I; E# D9 P0 Z; t# f小试Hessian实现webservice6 _: N. b! h# p8 `. |( s  L8 ^! X
Hessian是一个轻量级的remoting on http工具,采用的是Binary RPC协议,所以它很适合于发送二进制数据,同时又具有防火墙穿透能力。Hessian一般是通过Web应用来提供服务,因此非常类似于平时我们用的WebService。只是它不使用SOAP协议,但相比webservice而言更简单、快捷。0 Z: V$ H8 z1 Y; k. b* f- P
Hessian官网:http://hessian.caucho.com/8 X  _) ^6 q7 _  d3 E6 N" y& @/ l, t
Hessian可通过Servlet提供远程服务,需要将匹配某个模式的请求映射到Hessian服务。也可Spring框架整合,通过它的DispatcherServlet可以完成该功能,DispatcherServlet可将匹配模式的请求转发到Hessian服务。Hessian的server端提供一个servlet基类, 用来处理发送的请求,而Hessian的这个远程过程调用,完全使用动态代理来实现的,,建议采用面向接口编程,Hessian服务通过接口暴露。
$ s; q& X; g$ N3 [9 f. k1 @$ n. LHessian处理过程示意图:, A% T2 H( A% Z1 o; t/ A$ l* y
客户端——》序列化写到输出流——》远程方法(服务器端)——》序列化写到输出流 ——》客户端读取输入流——》输出结果( t1 v9 r/ H4 j
下面详细介绍最常用的两种方式实现Hessian提供webservice:
5 _2 s# x* X, V' R纯Hessian实现
" `. @# ]% `7 N; Q* s0 g2 P- h配合Spring框架实现) v9 K% E8 C2 k" ~& `
在开始之前当然需要到官网上下载相关的lib包,放入项目的/WEB-INF/lib/下3 L; u/ A; G9 R) T$ _
【一】、纯Hessian实现步骤:
( R* @1 G* W& \# o6 {" i/ X1.基本代码7 v4 }+ `7 q7 n) h) n% m9 [0 l0 j8 ?
首先编写一个服务的接口类:HelloHessian.java
& ^' z/ m: p7 m1 A$ Y, b% KJava代码# e& ]) }: u8 y* H6 f  K4 p6 ~) V2 H
package michael.hessian;
; p; {6 i% s, kimport java.util.List;
$ v' f) D  z: R% O$ T- {import java.util.Map;
0 l' _/ `* k5 I8 X- A( _+ Y; ?/**
& F( q* G2 W. y9 F, r* @author michael* c, X( h* P) L( _( Y
*
7 }" Q1 F" S& T4 m*/4 g8 f0 Y- u, E
public interface HelloHessian {! H2 B0 B7 k: o) ?
String sayHello();
% Z2 w. _) j  l4 a% k$ O# @9 rMyCar getMyCar();
3 o$ _2 U1 a1 h$ T! R. dList《String》 myLoveFruit();7 v) h- w/ c% t% v  H+ a
Map《String, String》 myBabays();
$ x3 _9 f0 A6 G( M6 G: R}
* n6 K5 B3 u/ L/ G2 vpackage michael.hessian;; Q+ b2 o1 ]7 t
import java.util.List;
9 x) B$ a/ K5 rimport java.util.Map;+ E# b6 a, i5 e) f
/**% F3 ?+ ^  b8 P" ?  P
* @author michael
) ^7 i  W0 f4 ~5 `  }- k# p*
2 z% [" C$ `' n6 |*/5 _) P) B* \* Z' T
public interface HelloHessian {8 b( |9 ~& y2 R$ N. I
String sayHello();
4 x1 {* A% ~7 [3 SMyCar getMyCar();6 e' |% D- G3 s3 F2 Q
List《String》 myLoveFruit();
9 Q0 H0 u5 P/ ]3 `1 \5 LMap《String, String》 myBabays();; u+ j. I* w3 F# O" L
}
' Q* p% r6 K, G* T" M8 A* ~% D一个java bean文件MyCar.java:8 O% b& o4 @9 S0 R$ A* g* e  ?
Java代码* v8 x6 k" U  \$ P& N
package michael.hessian;- ~4 S( @. z8 T% S& W
import java.io.Serializable;
2 n' ~# q; ?2 P* f/ O1 f0 a6 n; E# E' q& L3 ~1 f; e
  N, ^  u. ^4 K8 W1 L8 C' \/ o
/**
. N0 R$ Z3 U4 T5 n* @author michael+ V! K2 S0 ~  V: s6 U
*, i/ R6 w* y8 S& b; I
*/7 S. W0 A: J$ j
public class MyCar implements Serializable {7 H5 y3 c1 ]" k1 L6 W
/**
+ h  A, G0 F- J4 O' i- A*3 q% m2 X1 B$ j# G" ~6 `) S- P0 S6 B
*/- i. M. U$ x/ z* I( O3 r3 U
private static final long serialVersionUID = 4736905401908455439L;2 K0 b! E6 u! ]$ j' i- S1 U
private String carName;
" G/ V8 F4 ]3 lprivate String carmodel;
: |1 l% Y3 i, ?6 P, Q/**
# t1 [& l- J& ~! J. B* @return the carName
+ [6 S$ h8 I, a% Z*/, l* [8 k) h" B: S) c
public String getCarName() {
2 {$ ?, k  [+ U7 kreturn carName;& A: D! z3 l: Z$ l7 W/ o. c5 J% E
}  O! I9 O1 ~( E9 \- C& g
/**
$ C4 x1 A5 r9 g7 ~: l* @return the carmodel( Q* n7 t+ d+ R  @+ q8 n5 R
*/
4 T4 N0 ^- i0 o3 f; vpublic String getCarmodel() {, H! B- V6 d* y2 |& q: L6 v* F  B
return carmodel;2 K% f( `0 q$ `
}
2 k# w: `' E, R' D. m/**
' s+ Q! z& E2 ^$ ^4 C# \* @param pCarName the carName to set
  f. N; X* \; |  O*/- ?" K/ a6 @# g) {+ u! c7 G8 \
public void setCarName(String pCarName) {7 v$ h" {; G8 b# _3 z" N
carName = pCarName;
8 \( {$ m( d) |- r  [  ~7 p}
- O( a5 i9 k; z! L' g1 l/**
0 O/ Y8 m/ V, h7 w& n/ m7 \* @param pCarModel the carmodel to set+ m; J9 p, H$ F7 Z5 k9 N
*/
) {0 W$ H* g9 \* ?/ i5 Qpublic void setCarModel(String pCarmodel) {8 U$ A9 d9 Z- J% `7 \8 t3 A
carModel = pCarmodel;) @8 K# {9 S0 B$ N/ w
}* q/ d* a1 B7 U1 v, l( _0 B% G$ J
/**
8 a- U8 e( u* t& D* @see java.lang.Object#toString()1 g8 M  h6 M, d5 U% {. k
* @return
# o' Y1 X: X  M# b*/. r) s* C, u# v
@Override
/ Q! B2 K' X- M* X- U7 I* {, c- X( Jpublic String toString() {) h/ j& t& L& ]0 K
return “my car name:[” + this.carName + “] model:[” + this.carmodel. U& @9 N/ V: l# }3 t
+ “]。”;  y" f  Y* Q& s
}
" H1 E2 t, d% x* Q}
$ f5 {) K- }7 t; O& p. xpackage michael.hessian;2 x- N6 A, u% A! m, m* }$ u
import java.io.Serializable;- R; J$ L: ?; j/ Z) l0 Z
/**
+ q$ i) p) \3 h  E* @author michael8 A- K' V& ?+ d* S. `7 |
*
& m6 H, L* w/ a! H2 y*/
4 R) j  m4 ^( q* y8 Spublic class MyCar implements Serializable {
" H9 G" r. U& _$ u- f# q/**# u  u" a. N; H5 j7 K
*
+ Q" v2 h$ v* t7 J5 C*/5 V) S1 _& ]5 ?3 }5 Y
private static final long serialVersionUID = 4736905401908455439L;+ [+ W, b, N; A  }
private String carName;+ _( p2 s8 F$ _9 ~; i7 g1 R
private String carmodel;" N$ G# t) X9 [" R! z
/**
1 ]1 L; Z1 Y: p- `5 ^6 Y0 p  a$ h6 g* @return the carName: y; @4 o; u: D! K* U' x' g/ l# o
*/
( b) Q7 B) C2 i/ Y& }public String getCarName() {
4 y9 n7 W4 `3 @3 L8 A/ k, x' Preturn carName;0 Z& M# U8 j6 [, q# z1 L% T
}7 \) k) N! x% @& e; h  s& T
/**$ W: \! R# `* \' U2 X6 R
* @return the carmodel5 ^2 U; p  k2 d
*/
. w( N2 {5 l) p. Ipublic String getCarmodel() {
2 }2 @& H8 x+ dreturn carmodel;
$ r0 d) L0 q* N( e( f3 C6 S}
- C, T# w& ]( ~( ~# F' ]3 I/**; v  p% v. t& T9 @& ^7 ?
* @param pCarName the carName to set
" C2 t, u; W. s# H*/+ y" @5 K$ Q7 m; j- h
public void setCarName(String pCarName) {
  |- r. K( M. t# f* F/ ncarName = pCarName;9 f+ }7 P& X0 c1 b- p7 N! r
}
* k3 t5 M+ N# R8 Y# m* y/**
3 V- L9 ^) V" ?  }# K* @param pCarModel the carmodel to set6 a) p9 _4 e: K' Y
*/
) H$ h$ v. C. @9 W* H+ f& Y9 [$ ]public void setCarModel(String pCarmodel) {
# X0 s, B) I7 ]1 A& u0 d; T* {1 b3 ncarModel = pCarmodel;
& n4 S' H. A- E! s}
3 F/ e& h9 Z* l  @/ ~/**
- o$ I/ |6 _  U! j+ U0 |5 C* @see java.lang.Object#toString()
* ]2 a% {2 y! s1 ^8 \* @return0 T1 {3 f1 e9 W& T* i* Y
*/$ ]' T" r8 |4 s7 W2 O- E9 s  k
@Override
9 E* Q/ k! |, X( q3 K1 G, V: Hpublic String toString() {
/ V7 j  q6 |; _( _4 Y5 m9 Vreturn “my car name:[” + this.carName + “] model:[” + this.carmodel
) a- b7 s0 h2 G6 `/ R7 s9 C+ “]。”;% j, D0 K# @. w; c# F
}
0 x, m% ~9 O8 Y- H5 T}" N- _9 w5 Z( d: o/ r/ m
服务端接口的实现类:HelloHessianImpl.java
# l7 [0 \) Q9 J7 P2 h) E: cJava代码* R- ]0 H  \4 d/ D
package michael.hessian.impl;# B" b* ]8 O& X& [
import java.util.ArrayList;
' ^3 b) s. p& r/ aimport java.util.HashMap;
- I: C- K- ]+ X5 x- Q" V) Q" M; cimport java.util.List;
6 @6 I* w5 }2 n5 Ximport java.util.Map;  ]5 E( ]8 I4 l: U0 Z
import michael.hessian.HelloHessian;
4 c* K+ c' K3 O% x4 k2 n; [import michael.hessian.MyCar;* a0 G1 U# v2 H& J' k
/**9 ^- s8 ]# t+ {
* @author michael: W6 w3 W& y% E5 L
*( I5 K2 E# I! _; W
*/
% s; G6 e# o( t6 i2 Upublic class HelloHessianImpl extends HessianServlet implements HelloHessian {
, g7 i+ ~! R* N8 C/ i4 _( opublic MyCar getMyCar() {: h, b8 c" Q, b# V
MyCar car = new MyCar();( ?5 J7 S5 g  t. j1 m5 P
car.setCarName(“阿斯顿·马丁”);$ j2 l4 K0 K: L: i7 }( _
car.setCarmodel(“One-77”);
2 u5 I! M! G. greturn car;' W. S$ t8 R3 i+ u
}
" c) h% C, |- C; k0 f$ Npublic Map《String, String》 myBabays() {1 q1 p4 t; C  S
Map《String, String》 map = new HashMap《String, String》();  g" p# Z6 ?0 ]" w& C
map.put(“son”, “孙吴空”);- b1 E5 x6 y! B" p9 P5 n
map.put(“daughter”, “孙小美”);$ X1 a; R* O# s8 X$ a, w
return map;/ B# L' y$ ]! L( h
}
7 F# B1 S/ W" |2 E6 ]- s, dpublic List《String》 myLoveFruit() {
1 f. G" s, l: n, B0 z) ~# IList《String》 list = new ArrayList《String》();
7 ~  `  |9 _# R% |$ Elist.add(“apple”);
% |) b/ o0 [- @9 {- jlist.add(“kiwi”);
3 `- D2 K- l+ dlist.add(“orange”);. G) k9 R% y; s- q
return list;
- a/ w. w& q2 ~! K5 n5 w}0 a% L0 ?8 t: X6 w7 j% O9 p
public String sayHello() {
5 x( b& r2 ]/ J7 f8 Hreturn “welcom to Hessian”;/ [" p; U  C8 P" _8 u6 P1 F
}+ S5 i0 ]: t) Z# q- @" G
}! @- V" R) R) K& L5 r
, A5 Z' t, {$ B, E* ^  H
2 z  E8 S3 }" L0 q9 H: I- C% ^
package michael.hessian.impl;
% u: L; u1 ]+ e$ Uimport java.util.ArrayList;7 n4 \9 m$ k# [
import java.util.HashMap;; E) ?( b- ]0 ]' A
import java.util.List;
; }: Q# V6 m' h2 `& L8 {% _  Dimport java.util.Map;
0 b* y9 ?4 L( R0 T$ ^import michael.hessian.HelloHessian;: o+ x) C& V; u! t' A1 S# j9 A
import michael.hessian.MyCar;4 `, m6 L! y5 d/ }- F
/**
( w1 x) j" o, U* @author michael0 Q4 @! d! m: X6 V
*3 _  x4 `$ P) [3 T+ u' `
*/
! V: s+ V) M0 l. D5 q% {public class HelloHessianImpl extends HessianServlet implements HelloHessian {; ?! ^5 |$ c& N  [2 Z
public MyCar getMyCar() {
# M! B$ r& D5 [/ wMyCar car = new MyCar();' U2 [, I, x% A- @* e+ L, ^7 m
car.setCarName(“阿斯顿·马丁”);' A. y/ A# a( v" W$ [4 `
car.setCarmodel(“One-77”);, |6 T8 A( t" n2 r; g3 n
return car;
8 e3 {# e8 C  E7 [}
! V, G) M! Z3 Spublic Map《String, String》 myBabays() {+ p5 v+ a) p; P
Map《String, String》 map = new HashMap《String, String》();
7 {% A. i1 e8 p* Gmap.put(“son”, “孙吴空”);
: g2 j. G+ E4 Vmap.put(“daughter”, “孙小美”);
0 q5 k2 p) X# x) y: preturn map;
  O+ y8 }- I7 z. q2 a8 }5 o}
8 P3 ~, {: l+ B; E# N9 {public List《String》 myLoveFruit() {( a7 F5 F- _# k3 ?7 k; M
List《String》 list = new ArrayList《String》();
  \5 U6 l& U  O2 |& Ylist.add(“apple”);
2 r7 P, }. o' vlist.add(“kiwi”);
) `6 d' g6 i* jlist.add(“orange”);
6 Y, m# z6 I- _5 C% n& `return list;& O" s; A" A: X5 ?1 }* q" I
}7 ?0 t$ b  g: J
public String sayHello() {! |1 g- t" o4 `. s5 D: z
return “welcom to Hessian”;
; h) J& t3 R+ B}& m7 N+ P9 ^, k& g( {5 w
}
' `* W% }" h. u* Q2.配置文件web.xml修改4 D1 _) X5 U" D& P/ |
在web.xml配置文件里增加如下信息:: ?1 O6 l% ?( G: N
Xml代码* g9 h2 B# u- J; g! b9 f5 Z4 M! W
《servlet》. a  a7 ~  M  p4 w  ^( r
《servlet-name》HelloHessian《/servlet-name》2 [" \6 c, g5 P$ @% _2 s7 {
《servlet-class》
6 }8 x* L( z3 x' t! L" i1 lcom.caucho.hessian.server.HessianServlet
+ ]+ R5 Q' ~& k' y《/servlet-class》$ S9 a. R- S3 _0 A
《init-param》
/ F( B4 Z$ r9 Z. _" u《param-name》home-class《/param-name》
+ d9 t9 _( L  b7 V1 Q. m8 W' {8 M《param-value》michael.hessian.impl.HelloHessianImpl《/param-value》
$ a& x  I3 k3 v+ w《/init-param》
' n5 h5 a: X; K《init-param》
5 N0 p0 C7 w' V. d& y1 v《param-name》home-api《/param-name》! p  {0 s' V2 m/ _' e% b7 @5 K
《param-value》michael.hessian.HelloHessian《/param-value》
/ d' l) m, G' o' ]《/init-param》2 e+ M2 B9 `# y1 X) f
《load-on-startup》1《/load-on-startup》. s7 N( W, z6 H6 ]  [6 z
《/servlet》
4 Y8 f( K. H6 s0 t1 K《servlet-mapping》
( k5 V- c" N$ {7 W《servlet-name》HelloHessian《/servlet-name》9 u0 v( d! u# z. a/ W! M
《url-pattern》/HessianService《/url-pattern》( V# x/ l$ ?, {
《/servlet-mapping》+ f0 W7 F. f) U7 K4 ~" \: n% G
《servlet-mapping》* B3 a+ C% i/ [' z0 |% a6 u8 e/ l
《servlet》
$ A! A# s' l2 U1 V/ X0 g《servlet-name》HelloHessian《/servlet-name》$ J$ j* }9 r4 E- p, Q  p2 t7 N5 y- \
《servlet-class》
; x: W2 N( @. Zcom.caucho.hessian.server.HessianServlet
" C2 {3 s& r/ F' n$ A: V$ D《/servlet-class》( R# s' x! q& J' R9 a& G' @; T7 ]
《init-param》
8 r, ~. N, O* y《param-name》home-class《/param-name》, g( O8 {5 U$ Y0 K  C$ W
《param-value》michael.hessian.impl.HelloHessianImpl《/param-value》% z0 O; {0 O( Y# q
《/init-param》' g: E6 v2 L/ \5 I
《init-param》3 k( `) {: V, Z9 I) X
《param-name》home-api《/param-name》
0 d6 v8 \5 E) p/ s4 G《param-value》michael.hessian.HelloHessian《/param-value》
0 `  R. J! W0 o. W! U* ~% D9 g《/init-param》$ e/ L) `. x5 H# q$ g1 o5 Y; Y
《load-on-startup》1《/load-on-startup》
  g& k( p2 _  [, m5 l《/servlet》8 r# @3 [0 q9 c9 U- d1 |* t
《servlet-mapping》
6 v8 ?% S. [+ z3 y" C! o& |《servlet-name》HelloHessian《/servlet-name》, R0 D/ O0 X" V- `5 F4 ~. J
《url-pattern》/HessianService《/url-pattern》2 U) h8 E3 J7 `+ I7 V% I; ?
《/servlet-mapping》
, d. A; h- _2 j6 ]' H《servlet-mapping》
1 u" n0 M1 [/ Y7 y7 g( p+ I* b% B3 ~3.java客户端验证: Z4 L( d4 b" U, E7 [( K; k
Java代码; G2 E& m+ k& |9 `' m1 U8 A  t
package michael.hessian.client;
" O7 V' C3 c- H: Pimport java.net.MalformedURLException;
" o- U2 ~6 A1 h4 O6 [import java.util.Map;) p. ^) b; E- P6 H
import michael.hessian.HelloHessian;
5 ]: K# {5 }, W1 {import michael.hessian.MyCar;
" J. r7 x% b6 @import com.caucho.hessian.client.HessianProxyFactory;
' b) ^4 p* h+ O/**
& a2 S# N0 p  M5 K0 ?5 o* @author michael
# K4 U# W9 \' A. G*% T7 R9 P' Q6 Q4 u/ i' [! H8 y. j
*/: e7 E$ }! z7 ]. J7 d: H( ?
public class HessianClientTest {5 t* u; q  D( d5 ^( @
/**
9 T2 h" P7 |8 v, E) r' Z! v7 x* @param args
* U) V* _! S1 R% D, e5 @: X*/  @3 {) o( S$ x  Y& V
public static void main(String[] args) {
  k! S% X; F: ]3 H1 G" R) U) E. i9 KString url = “http://localhost:8082/J2EE_sjsky/HessianService”;7 a( l" G4 p8 V  j9 t+ u
HessianProxyFactory factory = new HessianProxyFactory();
. D, N; T) l' y( H7 W" Xtry {7 B' ~- W6 `2 Q- P3 A' g% W
HelloHessian hello = (HelloHessian) factory.create(
2 ?2 V% y/ L" k/ o, G) j6 EHelloHessian.class, url);
' P* W1 y6 a0 m. d, r$ ^: lSystem.out.println(hello.sayHello());& _, ~; E& B. _7 t
MyCar car = hello.getMyCar();- `% W2 w: P8 L. j
System.out.println(car.toString());
! V* F0 J$ u1 f  B' p' n8 k& b: u9 kfor (Map.Entry《String, String》 entry : hello.myBabays().entrySet()) {
( p% \) J# k) H6 bSystem.out.println(entry.getKey() + “ ” + entry.getValue());6 @/ x3 A) W& g
}
3 S: i3 z* L$ ~8 O5 l. tfor (String str : hello.myLoveFruit()) {" q& @9 R3 p* Y3 F* u& `
System.out.println(str);
# m, V/ c0 c: s8 F& ]% b* J3 F5 B}
9 T! C4 J& y2 g, P; F3 s; J} catch (MalformedURLException e) {
- _# ?7 G* P& S/ Z  He.printStackTrace();
" D& r1 j: F9 i. O( o}
# d- ~. ^! l, m}2 v4 j$ n2 X. A) b  V  ^
}
2 ?; `$ |9 I6 n( g4 k' d) _package michael.hessian.client;/ S3 w0 x, u7 p, V
import java.net.MalformedURLException;/ j$ f7 v& y" v2 t7 `. l
import java.util.Map;
8 {! K* A3 x, G& ]( Y; wimport michael.hessian.HelloHessian;4 L' T1 m$ J5 E; V1 {  m
import michael.hessian.MyCar;
: ?& G; h  B$ R& o6 yimport com.caucho.hessian.client.HessianProxyFactory;
% A& x7 X* P$ O( [' D+ P' d/**7 q  ~# K) x$ ?+ N8 v6 S' S
* @author michael) b7 w. x- M6 o9 F+ }
*0 N' I0 o, i: P5 V# J, |
*/
' q: w/ d. f" @& T' v! d: Y3 Epublic class HessianClientTest {
+ g6 Q+ ~$ F7 l2 h& C, J6 G/**
. K+ B6 B! ]2 _/ ?) t* @param args
: i+ }8 ?" C2 Q. F*/. X- q" r* Y% t+ I% B" v
public static void main(String[] args) {
1 a2 [( g9 S4 u% A  K, nString url = “http://localhost:8082/J2EE_sjsky/HessianService”;2 j! \- X( B; J& b* K% p
HessianProxyFactory factory = new HessianProxyFactory();2 Y" @' u; {8 g  M* m3 J! N
try {( `1 f2 O3 b6 v; @# f
HelloHessian hello = (HelloHessian) factory.create(% K$ G' a! z4 J! @1 ]: x: A, t% B, B
HelloHessian.class, url);  r% I6 o! Z+ R  I2 ~
System.out.println(hello.sayHello());# U/ I( w1 K2 Z2 j8 i% S
MyCar car = hello.getMyCar();; B! L4 n2 p3 v
System.out.println(car.toString());) T9 c0 s. x& D6 @; Z' L
for (Map.Entry《String, String》 entry : hello.myBabays().entrySet()) {
1 E+ p+ W% k9 _, G) ]System.out.println(entry.getKey() + “ ” + entry.getValue());
+ ^/ N" _9 B) ~- D! Z}
9 \0 `" D3 G1 Z4 Q- X% hfor (String str : hello.myLoveFruit()) {% T  `# b4 p' v. x8 R
System.out.println(str);% e9 A( y* E" c$ s2 T, B
}
; m/ J; t8 M8 `3 S+ G2 |} catch (MalformedURLException e) {- c7 F0 y/ O& ^7 M$ i, H
e.printStackTrace();
0 B7 i( X5 w0 Q% S4 d1 G* K}
7 x/ h2 c" o/ j0 F}% Y/ w, P0 ?9 r$ \, u5 O
}
) S7 M: P. N* F, i0 h运行结果如下:3 ^1 p; [+ G- W

9 k/ y  ?! o* [! b
' F: p8 C' ~$ xJava代码+ n8 q$ a3 o0 q. O! Z1 e5 I
welcom to Hessian
: ?* P! T! {! s$ H# x, Nmy car name:[阿斯顿·马丁] model:[One-77]。0 C3 B+ L- y( Y4 i9 E) A
daughter 孙小美% x5 G1 V+ s+ i) b
son 孙吴空! _. ]1 m; \# w/ ^
apple
7 K2 N' U( o+ F- `/ S* t8 [kiwi1 B4 y; }( j9 Q" T* |" o
orange
+ @( ]* Z& D. H2 t" S  n9 awelcom to Hessian
- h( S4 ^. y) F$ g6 `# n+ ^8 imy car name:[阿斯顿·马丁] model:[One-77]。3 a4 k) V) ?/ x4 @) P
daughter 孙小美
4 \9 P1 M- K# q) Dson 孙吴空
8 {: j3 p7 o: \3 N% U  Dapple  m/ J& H( P6 h9 v5 {% E
kiwi
7 _4 f  \. T/ y# oorange  L* |( W: l3 Y4 D6 C
【二】、spring+hessian 实现服务端:
; ]6 g  f5 R! ~: [% f1.基本代码见上面的demo
9 D- ~3 H6 L1 Q5 X/ ]. w6 l2.修改配置文件
) I9 p8 L. P7 ]: I: ]9 c" K( o在web.xml,增加内容如下:
) g+ p. o- g: MXml代码
/ @4 K, \) B. J5 I2 _  l$ c4 w$ x《servlet》
1 i( Y+ T& R; E. K《servlet-name》springhessian《/servlet-name》
. O  c' g* ]* R( W《servlet-class》
* g  Q& I. p3 porg.springframework.web.servlet.DispatcherServlet
$ ~* R3 n4 \) M$ {8 J6 O9 k4 A《/servlet-class》- ]/ V" \% h0 i7 L0 c
《!--- W) ]# u# t  n
《init-param》/ v+ e$ ~7 Y& P5 B- e  c
《param-name》contextConfigLocation《/param-name》. S* y' G6 k" U
《param-value》/WEB-INF/springhessian-servlet.xml《/param-value》: Y+ _6 ?1 n& x* T/ B
《/init-param》: O2 m9 p3 f" o5 N8 p
--》
9 B  E! K9 l7 w& h, Z. K' b《load-on-startup》1《/load-on-startup》
9 `4 g; ]/ M0 i3 b《/servlet》% B3 m" W' U/ ?4 V
《servlet-mapping》( H! C; }( e9 b6 t) ~7 ?
《servlet-name》springhessian《/servlet-name》
) I; M( Q  |" E《url-pattern》/springhessian/*《/url-pattern》$ N  S0 {( i0 L8 ~" t) S1 a
《/servlet-mapping》
; a% W/ @' g7 R# v1 R( @《servlet》0 ?  Y. P: t% |1 I8 `
《servlet-name》springhessian《/servlet-name》/ w: W) a. c8 [/ p
《servlet-class》
" y. K0 H# h( y& H( horg.springframework.web.servlet.DispatcherServlet
5 g( X$ ]7 ~9 `( o$ f/ Z《/servlet-class》) X' o2 ?, n+ y
《!--
1 a% X) m9 F1 u7 e' |# @) g6 X《init-param》$ |& Z6 c. _: i6 `' \  b
《param-name》contextConfigLocation《/param-name》
- q' j+ X. j  |& L1 z3 @- }《param-value》/WEB-INF/springhessian-servlet.xml《/param-value》2 \% m1 J9 j3 H# N7 l
《/init-param》
: F/ j" }: G8 N+ T! [* Q+ T) A3 P8 K--》
1 o) _/ W( m- J( h: P7 B$ r《load-on-startup》1《/load-on-startup》
$ V+ ]2 @* D+ ~) U( ?《/servlet》
% U1 J: h/ [4 c5 Y& Q6 o5 n《servlet-mapping》
! W6 p1 g  i) S0 o  ]《servlet-name》springhessian《/servlet-name》
1 Y3 m' y; p( S, ^3 C! E《url-pattern》/springhessian/*《/url-pattern》
5 u5 r8 T: R- F( q) e《/servlet-mapping》
9 j' B3 B; Y; v5 w; S% i* T在/WEB-INF/增加一个叫servlet-name-servlet.xml配置文件。该文件的命名有一定的规则,红色servlet-name需要和web.xml中的《servlet-name》springhessian《/servlet-name》定义的名称相匹配,比如本例子应叫springhessian-servlet.xml,这样简单也不容易出错。% I5 P4 w9 [! m7 _. M9 u- b
当然该文件也可以自己任意命名。如果是自定义的文件名称不符合上述默认的规则,需要在《servlet》中增加《init-param》相关属性,人为指定加载配置文件,否则会报错。) }5 s. x. W- X$ K' N# y7 |$ T5 d+ Z: V
范例:springhessian-servlet.xml
) i0 T1 C1 M; Z9 a* N  O  zXml代码) k; r2 y! m! q8 Z  e- t! f
《?xml version=“1.0” encoding=“UTF-8”?》
% `: ?' s7 n% w3 t& W* Q* m% l《!DOCTYPE beans PUBLIC “-//SPRING//DTD BEAN//EN” “http://www.springframework.org/dtd/spring-beans.dtd”》
7 C2 c* H2 K$ P0 J* X- ^- l: F《beans》% N$ M( b% N6 t! a, T7 u
《bean id=“helloHessianImpl”
! l: J! t- @; r9 d8 Fclass=“michael.hessian.impl.HelloHessianImpl” /》4 X9 B& H5 N3 J' m" @- `, r9 k
《!-- 使用HessianServiceExporter 将bean生成Hessian服务--》
# _. l/ Q2 z. n: F" @5 P《bean name=“/helloHessianService”
+ ~+ P5 S8 R* j6 U, uclass=“org.springframework.remoting.caucho.HessianServiceExporter”》
* D, ?5 A) g" l( W; x, s- t' l" ]4 w《!-- 定义需要生成服务的实现类--》3 F& W' v5 R+ Q, e
《property name=“service” ref=“helloHessianImpl” /》1 E& q) T) E  O: B4 n* U5 M
《!-- Hessian 提供服务的接口--》5 J5 y: T6 T9 @0 f
《property name=“serviceInterface”
$ O" V" ?7 j( Z; U# a1 cvalue=“michael.hessian.HelloHessian” /》
; }, ?# Q* A0 Q, n《/bean》2 [9 }" x. F$ U
《/beans》
" Z$ r7 \# i+ w( x《?xml version=“1.0” encoding=“UTF-8”?》
7 x; A& D# y' V% w$ g7 m! l《!DOCTYPE beans PUBLIC “-//SPRING//DTD BEAN//EN” “http://www.springframework.org/dtd/spring-beans.dtd”》
3 _- M8 B9 n# c- n《beans》
/ U& D: i# R/ w) I( V7 ~《bean id=“helloHessianImpl”
8 ?* f# V- [- l$ x3 I& c/ {8 Xclass=“michael.hessian.impl.HelloHessianImpl” /》4 N% f  p4 N) b
《!-- 使用HessianServiceExporter 将bean生成Hessian服务--》5 x/ {( O- ~! @
《bean name=“/helloHessianService”
6 B; x0 ^4 l0 ]+ {6 y$ j& aclass=“org.springframework.remoting.caucho.HessianServiceExporter”》
% H1 k: h; P3 }, }# \  U《!-- 定义需要生成服务的实现类--》
: |4 A' U. L( l《property name=“service” ref=“helloHessianImpl” /》
- `, K: D6 r% f《!-- Hessian 提供服务的接口--》: o; ~" a* ?' c$ X9 C0 e' P
《property name=“serviceInterface”
, A# J3 U/ K7 h; i. Kvalue=“michael.hessian.HelloHessian” /》
3 ?: v1 k* r5 D8 F3 X《/bean》" M' s& i2 o- r+ g* t
《/beans》
* R7 m8 m, f+ y8 ~! A1 ]3.java客户端验证: T3 c! m/ d3 h3 y- |( Y3 J6 w- y
和上面的例子相似,只需要把访问的url替换成新的即可如下:
" a; x# a) J/ p! o  D' b/ t: M1 H+ OJava代码
1 u1 @& M3 \8 v2 ^% L9 ZString url=http://localhost:8082/J2EE_sjsky/springhessian/helloHessianService
6 n7 L1 B& \; eString url=http://localhost:8082/J2EE_sjsky/springhessian/helloHessianService9 b" j+ |3 Y' A3 {0 V7 B
运行结果和上面例子一样。
8 j; }% ^+ s+ A2 ^8 b" z5 N3 [% q5 h4.spring配置客户端
1 V* d/ @+ H8 C+ O4 @! f: r增加一个spring的bean配置文件hessian-client.xml, U2 H- _+ o6 ~: O( f
Xml代码" d7 k/ Q- {9 y6 x
《?xml version=“1.0” encoding=“UTF-8”?》
8 Q1 s5 ~9 u  I《!DOCTYPE beans PUBLIC “-//SPRING//DTD BEAN//EN” “http://www.springframework.org/dtd/spring-beans.dtd”》
' {% O1 y3 j# X# C: f* Z4 Z《beans》9 D7 @& a* D4 k  ]6 }
《bean id=“helloHessianClient”, y  @; E( q; C3 F3 Y- s6 k1 P
class=“org.springframework.remoting.caucho.HessianProxyFactoryBean”》
7 \/ T! J9 c$ K! V+ B  @2 l5 L《property name=“serviceUrl”》
9 W$ K  l  Z3 q- j8 u2 e. ]《value》
) F5 d/ ]8 R/ b: n. o) h  f- ^+ U( w+ Ihttp://localhost:8082/J2EE_sjsky/springhessian/helloHessianService3 c4 l5 W, c7 R9 S! P0 u4 E! d
《/value》
6 [+ }0 d! o' j# G& h  u0 \( c《/property》
, y: i0 s# Y0 E% G: F  A6 E《property name=“serviceInterface”
2 r9 O8 O) N3 F) ~value=“michael.hessian.HelloHessian” /》. e; u3 J3 d( {% z  z# C
《/bean》+ U" y- f" I; g3 r8 \2 o) r! b% ~
《/beans》% }) Z" H2 O0 o) o* d3 j
《?xml version=“1.0” encoding=“UTF-8”?》
! g  X) m% @! E2 B& |# u+ Y% I《!DOCTYPE beans PUBLIC “-//SPRING//DTD BEAN//EN” “http://www.springframework.org/dtd/spring-beans.dtd”》3 D: a2 i7 B2 z8 T' z9 Z
《beans》6 }1 |6 d+ Z7 n4 I/ o
《bean id=“helloHessianClient”
1 U. }* X5 M+ [  D$ \class=“org.springframework.remoting.caucho.HessianProxyFactoryBean”》
3 z' S8 W9 A# K% @/ d/ T1 F《property name=“serviceUrl”》
  B+ N6 b' e2 e- P8 q( w( Q《value》
: F3 i9 J* s% O: {http://localhost:8082/J2EE_sjsky/springhessian/helloHessianService! b- E' b" R# n8 Y4 C4 \1 k
《/value》
7 L( J4 y9 Q! s$ X# q% u  u- n《/property》( R9 o9 `9 ~) X5 {
《property name=“serviceInterface”
; A4 |6 o$ o- C' A, P& pvalue=“michael.hessian.HelloHessian” /》- g! w# x4 Q" ?7 M5 q
《/bean》
7 E0 r7 z* E' ^/ }, E《/beans》
  @; F" F- x' G# I测试代码HessianSpringClient.java:9 Q& w  S$ B, A
Java代码
% m$ @, I6 r+ v6 ^3 ppackage michael.hessian.client;
8 N! m! D8 t+ C% |% Y  Nimport java.util.Map;
6 z* T, M+ ^! p- l, _import michael.hessian.HelloHessian;
' {3 f" b* C2 Z9 Mimport michael.hessian.MyCar;
* A% R+ ?6 y$ {) x" E6 }import org.springframework.context.ApplicationContext;( U7 {, Z/ q, x. n6 {- Y1 j( F
import org.springframework.context.support.ClassPathXmlApplicationContext;
7 a+ w) y1 D: P, E9 j/**2 s3 d+ `6 v7 I
* @author michael' K8 T: o: k0 e' F! h
*  U3 ^* B* ]) t5 ^# m" o
*/) h; H( {/ X! h' `# w8 p

1 i8 B% [8 T% s1 [' b( o
$ o1 F7 B+ P2 |' tpublic class HessianSpringClient {1 r9 s5 D* t. O9 s3 z
/**
1 y& ~2 g) t9 n9 k) ]" V' F* @param args
( \0 Z0 i. W1 v# r6 v*/
7 M4 {9 m& c- Z, N1 [+ Jpublic static void main(String[] args) {0 V; u5 c6 S" h% g( e. |: L! [
try {9 E* _! a, ~' O
ApplicationContext context = new ClassPathXmlApplicationContext(. e1 n9 x& v* M: I9 e
“hessian-client.xml”);
5 H% d$ T* q' d. j7 M6 BHelloHessian hello = (HelloHessian) context1 A6 p+ }. U+ f8 Q+ g8 `  O: E
.getBean(“helloHessianClient”);
( Q8 G' o9 \7 O/ I# jSystem.out.println(hello.sayHello());7 G/ ~0 S) G+ E5 b
MyCar car = hello.getMyCar();
6 q1 B+ Y, `% Q( D6 Q8 v# l8 Y. ASystem.out.println(car.toString());
9 x' E+ @' Z9 W- {$ d6 ofor (Map.Entry《String, String》 entry : hello.myBabays().entrySet()) {: o9 m' K% @0 z8 ~% i
System.out.println(entry.getKey() + “ ” + entry.getValue());6 E! i+ O( H7 @* K' Y* w0 k/ Z8 g
}3 G/ @& {. n( _3 _# M( z1 F) t; m
for (String str : hello.myLoveFruit()) {- @9 o' S' U- q
System.out.println(str);
( A& }; L% ?4 y+ n) f" N' F+ f}
2 B* ?& |) g) {0 T- B) k} catch (Exception e) {
7 d1 j& [0 ]+ t' N- Ae.printStackTrace();0 W- Q) U6 ]/ B8 M
}* G* j: n' ~' k; N% V
}' ?. r3 x2 Z; x& M, s( n8 {# u& h
}
+ W+ W# E1 P" bpackage michael.hessian.client;6 i+ K' @! n! }# Y# I# N5 R+ j
import java.util.Map;
2 O( g# E0 A1 [) d% mimport michael.hessian.HelloHessian;
( [4 F; a; |2 k$ G3 `import michael.hessian.MyCar;
  ?: U2 m: ]$ R$ N! C$ U/ Timport org.springframework.context.ApplicationContext;
3 |8 `. o! `: g5 Y/ L% S* Ximport org.springframework.context.support.ClassPathXmlApplicationContext;
) [6 M: e4 t( @9 u/ S6 s/**3 ]9 K0 V$ B4 \0 ]" H! h8 l+ \
* @author michael
, f# @) g9 Y9 B0 X2 x% V  p*' A. X% R# Z) Z9 F/ u
*/
* G  Y: ^! j2 C6 [3 ipublic class HessianSpringClient {+ e; h# {; ^( |% H5 R1 _/ F/ X
/*** x( K7 }0 B. U$ X
* @param args8 Q" ^6 j4 v5 b  P, _
*/# H1 P* \4 Z+ P' |! d; ~' S
public static void main(String[] args) {
& l* v- G9 G: ~4 b% m- [1 Z" ]/ `try {
& H( O  j. ]* oApplicationContext context = new ClassPathXmlApplicationContext(+ @/ _- x. A0 n. e
“hessian-client.xml”);
. X$ J; {" M$ Y$ Q" X- F9 r0 V; r' Y( {HelloHessian hello = (HelloHessian) context
, y/ Q. }: f1 S5 D" e5 d9 k: s- `.getBean(“helloHessianClient”);
& v) K0 K2 g( [* D0 y+ B- z2 i/ ySystem.out.println(hello.sayHello());4 p# U9 J0 E' [: d
MyCar car = hello.getMyCar();
) C3 D' h# ]8 w' A7 h+ i+ B6 aSystem.out.println(car.toString());
4 i3 p3 B. g  sfor (Map.Entry《String, String》 entry : hello.myBabays().entrySet()) {: I- p& z' F! M# m
System.out.println(entry.getKey() + “ ” + entry.getValue());
. V+ C- H9 L9 t, K2 X  U}
, H$ i. y: E* n/ _' ^" h5 `' `for (String str : hello.myLoveFruit()) {
+ l/ a2 @1 n1 I9 R5 RSystem.out.println(str);& A+ @6 T6 d0 f) m- \) V
}0 S9 E1 v) q! a
} catch (Exception e) {2 ~, n' Y7 p6 }, R+ W( ^+ k' D) U$ G  L3 \
e.printStackTrace();
! s# F/ L: f2 R  V; [$ \}
9 Y! n/ ^+ S0 d5 k4 C% Q0 V1 F}
9 |: B2 }& }7 }5 C( M7 X- x}" I. C( ?* F0 A  I  H
运行结果和上面完全一致7 m' R% j" I* x8 N) a
5.com.caucho.hessian.io.HessianProtocolException: expected string at 0x6d异常处理9 E1 P$ p" W/ a, o. u+ p# D1 @
我在spring+hessian整合测试过程中,客户端调用时,发生了异常,而服务端错误内容如下:
# X8 F$ S$ x% `. L# v1 yJava代码) V- r  V& \1 N5 Y
2011-4-25 16:14:44 org.apache.catalina.core.StandardWrapperValve invoke
8 r6 l; \( w% B严重: Servlet.service() for servlet remoting threw exception
  w& b7 J3 p& T2 N+ F5 R: @com.caucho.hessian.io.HessianProtocolException: expected string at 0x6d. e$ `0 A3 p; k+ d5 z, _; G
at com.caucho.hessian.io.Hessian2Input.error(Hessian2Input.java:2882)1 t: P  O; d* m5 j, e# h
at com.caucho.hessian.io.Hessian2Input.expect(Hessian2Input.java:2830)
- d+ T2 w9 z: U8 ?at com.caucho.hessian.io.Hessian2Input.readString(Hessian2Input.java:1362)
: g2 |6 t% F6 F/ z* rat com.caucho.hessian.io.Hessian2Input.readMethod(Hessian2Input.java:272)  B' `$ W3 Y+ K
at com.caucho.hessian.server.HessianSkeleton.invoke(HessianSkeleton.java:249)
7 O5 r7 t& F( W3 y7 V* j; sat com.caucho.hessian.server.HessianSkeleton.invoke(HessianSkeleton.java:221)" f7 `. [( E0 g* l9 l
at org.springframework.remoting.caucho.Hessian2SkeletonInvoker.invoke(Hessian2SkeletonInvoker.java:67)
- u7 u; B- J0 t5 K" nat org.springframework.remoting.caucho.HessianServiceExporter.handleRequest(HessianServiceExporter.java:147)
* Z0 C( _. q' h6 M' o. G2 Dat org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:49)" o& U- w+ h3 D7 {8 `  q4 P7 A$ |/ O; C
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:819)
% g3 W+ N' j9 z2 xat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:754)
  A' v8 @; P- `! Y" Z1 cat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:399)) D5 N7 A. v* z& [% `: l
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:364)7 e" }/ }# O  E7 C( A2 Q
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)% s2 O  F4 F8 C
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)4 |( v1 T$ J1 ?
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
: u/ X5 q2 W' F- ~% b; U' {at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
- d4 v) l# M% [$ L4 _at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
" t9 a( P4 x% d5 Y6 Y% ~at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)' O& g5 w% ]( ?. ~0 }' m- @
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)1 }1 e2 j! M' a0 C
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
7 {+ w5 ]) W& A3 C$ uat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109). Q% ^- e, |7 v) _1 q; {; J8 G
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)2 p( e; T0 m& U" ?: |; }" U
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)2 i! r! n+ t0 F% f% e7 \3 d2 |
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
0 w. c/ N8 D9 m" I  w9 Z" Gat org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)" V& D" J! ?' @; f; Z
at java.lang.Thread.run(Thread.java:619)1 f1 ?, [0 i& q( T" ?" j  f
2011-4-25 16:14:44 org.apache.catalina.core.StandardWrapperValve invoke
4 `- z, C% N$ ]; \; h6 [; I8 F严重: Servlet.service() for servlet remoting threw exception
6 m3 g5 A; j$ n/ k# e; w% b) ^) ecom.caucho.hessian.io.HessianProtocolException: expected string at 0x6d
4 x4 ^- d1 V9 u& y3 x0 }! nat com.caucho.hessian.io.Hessian2Input.error(Hessian2Input.java:2882)
, o9 C8 W6 l+ S# \* Q$ F7 l  Eat com.caucho.hessian.io.Hessian2Input.expect(Hessian2Input.java:2830)4 B' w) P& W$ ]. x  |
at com.caucho.hessian.io.Hessian2Input.readString(Hessian2Input.java:1362)9 V8 H2 V" i% @8 e
at com.caucho.hessian.io.Hessian2Input.readMethod(Hessian2Input.java:272)
7 J: w! k" I6 H7 c( P! K7 |, ]& yat com.caucho.hessian.server.HessianSkeleton.invoke(HessianSkeleton.java:249)
& r  A4 P) Z$ e& T; x# ~& X% ?at com.caucho.hessian.server.HessianSkeleton.invoke(HessianSkeleton.java:221)' k$ h2 e# z7 E* j9 b+ C, J* z1 N
0 v9 e3 t; E0 {' f7 ~2 E+ c. v
3 S2 c/ E: |7 u6 m' p
at org.springframework.remoting.caucho.Hessian2SkeletonInvoker.invoke(Hessian2SkeletonInvoker.java:67)- U7 V: f2 \% b8 C
at org.springframework.remoting.caucho.HessianServiceExporter.handleRequest(HessianServiceExporter.java:147)3 p; Q0 v1 ?% L
at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:49); [" X) }/ b6 ]2 {) T" n
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:819)( X3 J- c3 C# ]; ~
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:754)) l3 m' x3 B9 J  f
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:399)9 V8 V3 k* _$ [+ P+ j5 Z- Q
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:364)
3 H1 ]% W1 B& v. v" ?  H7 iat javax.servlet.http.HttpServlet.service(HttpServlet.java:710)2 u8 ?; p! n$ H  G7 K' B/ w2 I. c' J. Y
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)" v" R, Z5 q) S4 l6 k) `1 {
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)* ?* r7 Q5 E- t7 T- Y
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)% T1 G  y& o( H! e# }2 ]: V
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)1 n  e' m% h% K6 e) G% }
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
9 s/ W. e+ ?* [' V8 S* dat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
4 f. f) Q: y. g* x* I; w8 x5 mat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)3 g# }4 r9 J8 Z4 b+ A
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109), @, J! f6 h) b
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)6 `* f9 Z, H' R( Q8 `
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
5 W  _2 j: h  F0 zat org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)3 \0 }- p' |" a" l+ F+ i
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)" {3 k3 y5 r& D4 I5 o
at java.lang.Thread.run(Thread.java:619)5 L2 U( s) n% I* H: l
经查资料发现原始是hessian和spring的版本不兼容引起的,重新下载hessian-3.1.6.jar导入项目,一起运行正常,测试完全通过。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-4-26 18:47 , Processed in 0.196084 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表