a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 400|回复: 0

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

[复制链接]
发表于 2012-8-4 12:44:44 | 显示全部楼层 |阅读模式
Java认证:小小试Hessian实现webservice3 q- H6 x! b, o' g8 J
小试Hessian实现webservice
/ ^7 C& m0 P: fHessian是一个轻量级的remoting on http工具,采用的是Binary RPC协议,所以它很适合于发送二进制数据,同时又具有防火墙穿透能力。Hessian一般是通过Web应用来提供服务,因此非常类似于平时我们用的WebService。只是它不使用SOAP协议,但相比webservice而言更简单、快捷。+ o- r4 a. `7 B, S" A7 F! _
Hessian官网:http://hessian.caucho.com/' v% D9 |2 O( c2 J8 N
Hessian可通过Servlet提供远程服务,需要将匹配某个模式的请求映射到Hessian服务。也可Spring框架整合,通过它的DispatcherServlet可以完成该功能,DispatcherServlet可将匹配模式的请求转发到Hessian服务。Hessian的server端提供一个servlet基类, 用来处理发送的请求,而Hessian的这个远程过程调用,完全使用动态代理来实现的,,建议采用面向接口编程,Hessian服务通过接口暴露。0 }! L6 Y* n: g
Hessian处理过程示意图:
  F# w4 X9 t: n* _6 ?; g客户端——》序列化写到输出流——》远程方法(服务器端)——》序列化写到输出流 ——》客户端读取输入流——》输出结果5 ?" _" n" U  F1 m' b$ n
下面详细介绍最常用的两种方式实现Hessian提供webservice:
( x" o5 `4 y5 }$ v- R2 E纯Hessian实现: s% @# I: }& K1 e" A/ F
配合Spring框架实现7 D! A2 m4 r2 I" {0 W1 F7 f
在开始之前当然需要到官网上下载相关的lib包,放入项目的/WEB-INF/lib/下8 L* L# F) F, m
【一】、纯Hessian实现步骤:
+ U% `  F( k3 r& X' ?6 L1.基本代码3 O5 y' d3 _0 X6 z( h
首先编写一个服务的接口类:HelloHessian.java9 w3 y3 A" M7 l$ S5 P" r+ ?1 S% f
Java代码
2 R( r( Z8 M7 x+ qpackage michael.hessian;
" `0 m8 D3 h* O( M' rimport java.util.List;
/ G! r7 k; f& H8 D! ^import java.util.Map;5 O6 }& _% `8 C2 `( z
/**4 \( ]$ W: W# K
* @author michael
" b6 V/ Y2 z0 F' V7 B2 e*& r+ u9 n$ F$ Z6 ~
*/: N8 z3 U0 E$ j* k6 R/ W4 u: `# N. Q- i
public interface HelloHessian {
3 E: t1 T' Z" _! D% F! qString sayHello();; L" }* J: C2 p# u) |: U! L
MyCar getMyCar();
+ R! Y$ H9 f( l  `3 HList《String》 myLoveFruit();5 c% C  I6 S6 Z: _" j$ y
Map《String, String》 myBabays();+ v' o" [! F  ^
}6 Y; v$ j# R6 ~2 H
package michael.hessian;- A+ g* J" ~! p$ D& e/ v9 s
import java.util.List;/ d$ C" j" I! r; K
import java.util.Map;8 S/ U) P& Y; R0 c! F
/**8 k9 i: B/ w9 q1 d4 P
* @author michael$ w/ a" Q( @/ o! p. j1 \/ S; j
*
4 i% w5 o( J# N' p* b/ m/ S*/
5 Q6 k" D8 G0 `public interface HelloHessian {
  y. q: l+ i4 _7 t8 rString sayHello();
/ N8 a" |* s$ p; g( b* tMyCar getMyCar();* d7 D& p0 \3 P; ^' [( D
List《String》 myLoveFruit();
* v3 K: a& E/ lMap《String, String》 myBabays();  X/ }2 I) ^( H+ _( |
}; m8 t* b6 r- s% c3 D
一个java bean文件MyCar.java:
2 U+ N/ v* n, U& Q% |/ sJava代码- ^+ O/ S6 J7 [( U% z
package michael.hessian;
( [4 ~7 i8 \' k( Kimport java.io.Serializable;
2 m& A0 b& Z5 r( c2 S) Z% N9 P/ ^$ h# v9 u

8 v2 ]! W* L; f0 _4 l/**$ L* }" F) U7 h9 k3 H
* @author michael
7 o' j; N6 j+ m2 ^*& s" \- R, K, Q6 ]7 c
*/
3 K- H, d) K; \. h* b  ypublic class MyCar implements Serializable {! C. i8 e3 f$ ]0 V3 D8 y
/**
: H, g! M& W2 G*
9 W" e( z! B, z$ e*/7 L/ ]" ~' K  ^6 `7 V6 R* [
private static final long serialVersionUID = 4736905401908455439L;
! A% D/ P, s$ i7 B, h6 }private String carName;8 m7 }/ d; Z  K1 }
private String carmodel;% r1 S, ~5 ]7 W# ?! Q& E
/**
2 r# [0 `! f* j: z* @return the carName
0 ]5 t" s/ R2 Z5 l4 @*/
* h6 x8 j$ ?  upublic String getCarName() {' t" S& |' W3 S1 O5 {& b
return carName;) j6 s: G& l' C$ L
}
0 h0 e" z9 d( S+ m/ W/**
4 J" G. w7 F* ^, S* @return the carmodel
( Q. L( H% n; Y2 I1 M" u! z+ k( E*/$ M3 V9 a" d: b" n' w5 {
public String getCarmodel() {
; b4 }- k( ]0 _* b9 sreturn carmodel;% J+ e2 L- _0 N: p
}
9 s( R3 e/ N' |1 }0 f$ _/**1 Y: Z' b/ L9 F, ~8 v3 M0 v6 @
* @param pCarName the carName to set+ _/ P8 N% a  m' ^1 z1 Q
*/
% o; j! e% o  M* fpublic void setCarName(String pCarName) {3 \% k- i+ O  U3 Z/ p
carName = pCarName;: U/ O. [; ]! ^
}$ [6 l; g' n5 F$ k
/**) \6 y, Z# C% v
* @param pCarModel the carmodel to set
1 }) _# \+ k6 x3 ]9 E*/
, _- j+ P, o# A. ]; Qpublic void setCarModel(String pCarmodel) {; v* R2 ]+ E5 p" F. T! ~
carModel = pCarmodel;
. Y! _: M, e* M# R}% c5 |( t4 Z, q" P/ B; W- m
/**
4 r$ g. ?) @  V7 q7 {$ J* @see java.lang.Object#toString()+ J% \' V+ x9 r( k6 q  f! @2 E
* @return# |) N/ m3 |6 X& d4 b1 M; l
*/$ H: L) m1 o8 Z5 P
@Override, P: T5 G' A$ j" g6 M8 |. i
public String toString() {
. {; R# a9 y. s4 e& ^7 Y" z6 oreturn “my car name:[” + this.carName + “] model:[” + this.carmodel" V$ }# o% a. \" T
+ “]。”;2 q- A- d$ K' l( q8 H  Z5 w
}' K5 l- N) D4 O) g: q! ~
}
! q( {1 z  W4 hpackage michael.hessian;
1 u4 F3 I. g# d. a% Z- Q8 i$ t: p0 zimport java.io.Serializable;
# ~) r' E; C' `8 k' q' l/**
) ^  j1 q' e* h& W  Q* @author michael
; i8 M0 X+ r6 R8 K* N1 y9 B) o*& a" b' g$ b" l; h. a6 K$ S
*/
; m8 ]+ |4 G9 p3 ~* n( R& Spublic class MyCar implements Serializable {
  V) i7 ^/ X5 H7 G" \/**+ s3 H6 p2 i. T6 K2 Y0 Z
*. w6 w* Y& u/ w6 w
*/# g9 P8 O0 T; v' z
private static final long serialVersionUID = 4736905401908455439L;
6 G9 `$ m0 |7 u; C+ k" fprivate String carName;3 G$ Z: P$ \0 `/ }! u' H$ R
private String carmodel;
0 n1 u9 X4 M' z) U& b2 \/**
7 R: y& V* A' K/ g* @return the carName$ U% ~. [7 g, w- V$ ?4 a
*/+ G2 u5 M$ [9 T; a6 g- ^$ w+ F4 Y9 J! ?! M
public String getCarName() {& o. f0 ^. ~/ ?
return carName;
1 C4 |/ ]% M+ y$ N0 n/ F}
! O( M  O# M+ E/ q- v! p2 s- ]/**9 N( o$ S3 {$ }. e1 f
* @return the carmodel$ m6 u( p$ m9 ?2 k, Y. p
*/9 f; ]- y/ B9 e3 x: f) J, x
public String getCarmodel() {4 u7 I: Z; M5 J4 I+ c8 u* X
return carmodel;- d2 N$ A& t& A4 K
}
$ A) O% C% W/ A9 [4 J# [4 |/**' m$ A) O5 A+ k3 m2 F$ m
* @param pCarName the carName to set4 C2 b( ?4 N- u9 `" U5 W2 \
*/+ {" l, ], d% u5 l6 w9 [' e$ S0 c
public void setCarName(String pCarName) {
1 Z9 I* x5 _8 P* \' W, WcarName = pCarName;4 v* D: }2 p. s
}
# o4 K1 F% H8 x' O/**- T" i' v- A1 ^8 {4 D/ \5 M1 A
* @param pCarModel the carmodel to set0 W% _% s1 X% `$ W
*// e. F; R6 \6 Y
public void setCarModel(String pCarmodel) {
2 l5 B' i1 O3 H5 rcarModel = pCarmodel;6 }( s+ U) h9 t
}. E! s9 K9 l6 }# O1 d6 @% ?
/**
! G8 ]5 y. O" Z1 w2 J  G* @see java.lang.Object#toString()
" Z9 `: N! X& f' K1 A* @return
3 _$ g1 b% u* ]1 m9 Q4 S9 W+ w*/1 u  W6 K0 I- M7 K
@Override
" {" a1 M6 v6 Q* f! Hpublic String toString() {9 w" s' x8 `0 j+ C1 o# x
return “my car name:[” + this.carName + “] model:[” + this.carmodel8 A9 X3 B, q0 T- M% T6 X9 E
+ “]。”;
& `0 P0 C9 o6 i- ^* z+ ?. {}
/ a' C1 \0 w' G6 m: A0 K- q}
; U4 s2 S* s9 U3 M服务端接口的实现类:HelloHessianImpl.java+ u/ O! [9 _. p7 S
Java代码
5 u0 k( U  Q5 y; F# K4 W: bpackage michael.hessian.impl;
6 U9 K1 E8 L  W1 T7 M( Limport java.util.ArrayList;/ q. @; n' i( I5 p: T, @
import java.util.HashMap;. J. U# a6 _3 [1 ?2 D
import java.util.List;
3 k4 _$ ]$ I$ _3 ]5 {) o7 b3 Dimport java.util.Map;6 ?' A* J4 J% M3 }: d
import michael.hessian.HelloHessian;% V% A* V. L; {# j$ g
import michael.hessian.MyCar;/ ~. Q' M) F. K* c3 y5 d' F2 e
/**- H- z) B" o. ?- B' {7 Y
* @author michael8 W' W  H# N+ a: Z5 ~+ J' x
*0 A8 T" V6 E1 f, i8 _+ A
*/: B7 U0 @- w+ k
public class HelloHessianImpl extends HessianServlet implements HelloHessian {
  M! r& s5 F1 m9 Jpublic MyCar getMyCar() {7 o$ {9 w4 p; T/ k% [
MyCar car = new MyCar();8 g2 _( I4 p8 M+ S" _
car.setCarName(“阿斯顿·马丁”);( M. V$ U5 X$ d+ B" n. u
car.setCarmodel(“One-77”);2 j2 F6 B/ T8 F# U8 L. ?
return car;
0 I- M  O% u" u5 P' J}0 ~+ {1 W+ y+ o
public Map《String, String》 myBabays() {
( ^+ E# Y( n! d/ v8 VMap《String, String》 map = new HashMap《String, String》();, ?, @# o# o0 ]% \: L
map.put(“son”, “孙吴空”);; r& v- ^- ^& o6 F: e
map.put(“daughter”, “孙小美”);- f& C: ^0 @4 i, H
return map;/ r. G; S& N7 k! P: W
}
, s/ k/ P4 X& a1 X- u3 }/ rpublic List《String》 myLoveFruit() {
/ g( g- \) z6 [7 Z8 K1 o0 L9 M. nList《String》 list = new ArrayList《String》();6 g$ D! I7 {- V% k
list.add(“apple”);
7 h* |8 q6 }$ L2 B& _0 j" tlist.add(“kiwi”);/ Y. J; S( G9 J! S0 M4 F! W
list.add(“orange”);5 z) S8 ^. U1 i! e
return list;
& F8 e! \& N, {- S% K3 a}
0 n4 v' |/ q- g9 k6 X" d% _' }public String sayHello() {) S6 s5 N$ ?% i+ \/ J/ _4 B' w/ T
return “welcom to Hessian”;
  e8 e. F$ q% ?- y1 F/ e% N}) C3 U3 f- T* P/ A  a" z7 e
}9 u3 q" s3 v! X& h' F; t/ [
, G( }. V- x( X# u8 J4 J* n5 _

% V1 |8 C" g# B# ]; Zpackage michael.hessian.impl;
, X4 L6 ]: C" B# \0 f  [import java.util.ArrayList;' e3 Y% X( U6 E2 W
import java.util.HashMap;% N! s& Y" l+ b  S4 R
import java.util.List;
, f0 M6 G2 v8 o4 k  ^/ eimport java.util.Map;
- M/ N8 h& E! A. j1 L+ r" y; Uimport michael.hessian.HelloHessian;
9 K' J- T" c& h5 \/ yimport michael.hessian.MyCar;
4 r6 E* {2 W- ~. l) h/**  }# k6 U8 D. Y# z9 t' V  D) k  R
* @author michael$ i' p* t  a/ s) l  A$ ?2 T
*
- y; K/ V  |  m1 Z+ }$ J*/# z* `6 W. O& F0 T& z
public class HelloHessianImpl extends HessianServlet implements HelloHessian {" D) T" _9 ]4 a
public MyCar getMyCar() {
) R% D9 o& m' l3 T  IMyCar car = new MyCar();  I% \0 U! p: Y& N2 E. G/ U7 G- P
car.setCarName(“阿斯顿·马丁”);& a, o! a4 s) {+ d4 C% O! i
car.setCarmodel(“One-77”);
9 _. i" k" o' i1 H5 w% Yreturn car;( A5 \6 d+ p* b  B; N7 z4 x8 }
}
' |+ E0 d9 M+ r* x7 _& C3 C$ apublic Map《String, String》 myBabays() {( o' m$ X9 N4 W2 x6 L5 x) n
Map《String, String》 map = new HashMap《String, String》();- Y( ^9 J0 M9 u/ s3 L
map.put(“son”, “孙吴空”);
* Y5 }, O1 ]) W: G# l5 Q! @. k* u8 u% Ymap.put(“daughter”, “孙小美”);
" N1 c& `0 Q) S% I0 _$ Ereturn map;- b8 F+ p# O; e! S1 @) Y% l
}
0 e8 t' @* Z$ x$ X1 R7 L+ _public List《String》 myLoveFruit() {$ L: F% I) J7 L" ?1 T
List《String》 list = new ArrayList《String》();
3 N! X  n" B' r, y8 g) rlist.add(“apple”);
/ ?4 k8 y. `2 x  Z3 @list.add(“kiwi”);
8 m2 b# }1 C8 P& O' |  ]' N$ klist.add(“orange”);
- o0 N! I# G4 h  r' S4 C4 Zreturn list;
& ~* j% Q" U# @' a2 M}
3 _: n! Z6 v" \. jpublic String sayHello() {' a3 Y; k* _& s# r" D
return “welcom to Hessian”;, b/ f3 j& g/ ^% f+ D; l
}
! D% m1 P- `' _6 A8 i8 j}
9 ?1 r& }$ a& v5 x2.配置文件web.xml修改
9 M+ S) e2 \. G( L在web.xml配置文件里增加如下信息:3 I( v3 u/ b+ O/ W6 O; i
Xml代码
( f7 i/ v. A% S/ j0 f) ]/ c7 ~7 _8 J《servlet》# i" p( Z' U# ^4 J% F* Q
《servlet-name》HelloHessian《/servlet-name》
/ Z, ], E8 c/ t《servlet-class》
' @. I# D4 Z" w# }) `" Y6 L+ Gcom.caucho.hessian.server.HessianServlet
9 l7 G& g# j1 i% d( ~- h; |% _+ l% [《/servlet-class》
, p7 O9 t7 z* K! o《init-param》. k, k/ P# Q! k6 ^! X
《param-name》home-class《/param-name》. ^) r# U/ _- j2 _: K8 V% r& m) Z
《param-value》michael.hessian.impl.HelloHessianImpl《/param-value》- }5 O9 m: p. z; N) X0 H1 M; L7 n
《/init-param》
, W6 R6 q6 L  r2 p2 J4 y( C  I《init-param》( P  s4 s* ~! v, x: a$ t
《param-name》home-api《/param-name》
* @+ h) A6 C# L8 D5 ~: q《param-value》michael.hessian.HelloHessian《/param-value》/ u, ?4 e$ u7 Q, x+ v, ?7 S  o
《/init-param》
* e1 n' z- ?) j: _《load-on-startup》1《/load-on-startup》& ?4 Z7 n# n' q! u, K# c
《/servlet》6 e6 m- c. [" i5 A! A( Q; W
《servlet-mapping》
- R+ q) C0 H- a《servlet-name》HelloHessian《/servlet-name》
7 M1 `# s6 J0 k9 X: t4 ^《url-pattern》/HessianService《/url-pattern》
$ h' B' L& b; p+ L6 r《/servlet-mapping》7 \) L: a6 b1 m* K- t
《servlet-mapping》0 j! s! i1 K/ l4 G. Z% g& o+ H7 U
《servlet》- m; t- _) O! M$ P7 U3 B7 V
《servlet-name》HelloHessian《/servlet-name》/ G* F! d3 d- H8 r- M
《servlet-class》
& e  {. I) T% r4 ~com.caucho.hessian.server.HessianServlet6 l, ~  s' V# p( X. p! R$ m7 S
《/servlet-class》& {8 {' j* g/ g8 H% t
《init-param》- y- y* ], Y; J+ b+ v
《param-name》home-class《/param-name》% C0 |8 q8 G( p$ O
《param-value》michael.hessian.impl.HelloHessianImpl《/param-value》2 x" S9 n0 p' k5 [$ P0 g: ?4 o
《/init-param》* B1 O  e8 M* o6 V5 ~
《init-param》4 m+ I( P; Z3 B: ~
《param-name》home-api《/param-name》
4 f; I. B% M2 Q7 Y3 v' c$ |《param-value》michael.hessian.HelloHessian《/param-value》3 H, m) M& H& f  @3 v3 h
《/init-param》
" ^9 h2 J/ |1 |4 u1 }7 I《load-on-startup》1《/load-on-startup》. i' W0 Z3 g& J- r3 [
《/servlet》! Z* z$ G! z; G/ B& k% @* _# _: ^0 X
《servlet-mapping》
) ?* U8 Y& U. w5 h/ h- u《servlet-name》HelloHessian《/servlet-name》: i) l2 A: d% [% m; I; |6 Y- y6 \6 G
《url-pattern》/HessianService《/url-pattern》
- I  r6 n6 ^9 }1 m" E# W6 D《/servlet-mapping》. E, \; q2 |: q+ v$ q$ y! M; Q( d8 j
《servlet-mapping》
3 @# B* M' b, v3.java客户端验证/ c$ f7 `) ]* h9 r' u% G5 A, W0 T
Java代码* o; C. n8 s+ J* \, r6 C
package michael.hessian.client;
* \& [% A( l* g0 ~import java.net.MalformedURLException;
9 G. b0 ]  l! X4 Nimport java.util.Map;( a7 M/ z. K  w; ~) {! A& A% {: u
import michael.hessian.HelloHessian;
! a/ L- r2 B$ `  yimport michael.hessian.MyCar;' {! E  I. A8 a( b- ]
import com.caucho.hessian.client.HessianProxyFactory;
4 h; g1 O1 Q  b- x* B/**# j8 E/ q( d  ]* @- m; D
* @author michael* _- }, W8 T0 @3 I% f
*
7 J$ ?  Y& h# d! A' L( I- q7 o*/
: W% J- H! X- b+ V; ?/ |7 Bpublic class HessianClientTest {
4 k  O# m* Z: F, v  L/**% `0 n6 a* Q( ^( z
* @param args2 s' j2 }+ h& S% [6 c
*/
1 j! x  `% F; E8 Z+ V" H% lpublic static void main(String[] args) {3 ~! \" ?6 l" r' @: G2 u( o+ ~
String url = “http://localhost:8082/J2EE_sjsky/HessianService”;; }2 n' F2 p: x" i
HessianProxyFactory factory = new HessianProxyFactory();* k- |/ `3 G7 ]
try {
2 V' a5 |. j) x" O, [$ H$ e$ \HelloHessian hello = (HelloHessian) factory.create(
3 \) r3 @# ~4 n5 ~HelloHessian.class, url);
7 E$ B! ~- n* n# ^% s# |System.out.println(hello.sayHello());! i/ P- v' d' C4 i5 s; j
MyCar car = hello.getMyCar();0 Q4 ^0 C7 x- U9 S) p. A9 t4 R
System.out.println(car.toString());
' L% x3 E2 j- `: ]% _for (Map.Entry《String, String》 entry : hello.myBabays().entrySet()) {
4 O5 J$ m- X( a6 k+ ^4 Z3 ASystem.out.println(entry.getKey() + “ ” + entry.getValue());% L. I) P; I$ F5 T
}  V  C. P4 b$ x# u( B' |( P6 A
for (String str : hello.myLoveFruit()) {3 `! G4 X; u) g' M% e
System.out.println(str);
7 q; D4 `7 B) _; D5 _1 C}
1 b/ u% T2 Y7 u; l4 x, I" ~) a} catch (MalformedURLException e) {4 q: ^  s  _! C4 |' ]' m  F7 ]
e.printStackTrace();
6 Q% T9 L# z# L2 n}5 x! c- n. a. r- T
}
0 p. J& u- H- Z$ `+ b8 D; W+ q}- P7 z* R. Q+ I* [
package michael.hessian.client;6 h0 \+ z7 H0 B" ^# h" W6 U9 D
import java.net.MalformedURLException;
0 K" `8 O0 `( G8 Uimport java.util.Map;6 |6 P. P3 X: ^5 v, }: E
import michael.hessian.HelloHessian;: C9 }# S6 r$ {
import michael.hessian.MyCar;& i7 o  w; t+ P( ]
import com.caucho.hessian.client.HessianProxyFactory;
5 q# K( G4 Z+ {/**
& x* h! D% U6 L8 c# i) X% ^+ a* @author michael$ Y! Y1 I  Z4 _" A2 o) K
*! V$ `6 `4 Y' s
*/$ u. ?( ^$ x! g% J# A4 I
public class HessianClientTest {
4 _  i& Q# ?& \6 O: J/**
7 |! F1 ~# Q% x6 h* @param args  g0 t1 r0 y8 v$ c
*/( Y' I1 F$ R+ K# x* P, H+ Y% R
public static void main(String[] args) {
$ O; K* X( ?. V0 C7 k8 @; z$ i8 Z7 nString url = “http://localhost:8082/J2EE_sjsky/HessianService”;; @) ]  H* A2 n8 X& r4 l+ b
HessianProxyFactory factory = new HessianProxyFactory();
) W  q% |: f- y0 Q! ~$ ^0 S0 Stry {6 y7 h1 K9 [- j2 p1 v& l
HelloHessian hello = (HelloHessian) factory.create(
2 [* L" \" b' q: n( q) Z$ a+ XHelloHessian.class, url);: U& l6 Y( o- @/ A" V; Z
System.out.println(hello.sayHello());
4 V/ M0 P0 x7 p; _8 ~MyCar car = hello.getMyCar();$ C5 }: R. S( P( w& v
System.out.println(car.toString());0 u  ^$ w6 a8 Z; v
for (Map.Entry《String, String》 entry : hello.myBabays().entrySet()) {
. L. C1 ?7 v" A# z% T! Z" Q( TSystem.out.println(entry.getKey() + “ ” + entry.getValue());, F6 v1 N- H- J( C, B
}
* Y0 S) E! S7 g. Cfor (String str : hello.myLoveFruit()) {$ O. j! f+ Y' U+ ?
System.out.println(str);
. e: R( h* G8 X( I}! ?# b) z+ ^6 X
} catch (MalformedURLException e) {( ~1 J5 I- m6 K, g, z, X6 @1 ~9 T
e.printStackTrace();
2 a/ ^& B/ l- F}4 Q  _2 B7 L+ V+ H% @3 T4 N
}4 p5 ~% V+ `9 J1 w+ e
}
1 ~+ N; d4 N2 F运行结果如下:
0 k! g/ ~/ X6 H: D8 r5 G  H+ {$ s  o/ Z8 o9 f$ @0 l

# k& n# u5 Z$ J  u- \2 [% N  FJava代码* t% N, i; q8 G. ~2 a+ n/ ^; o* c1 k
welcom to Hessian
+ g" d1 V- o9 T( ?+ G0 o. pmy car name:[阿斯顿·马丁] model:[One-77]。' P, j; F3 D; w8 E
daughter 孙小美) W; C1 i2 V6 s  T) ?/ ]9 x- U
son 孙吴空
( T3 n5 O. m% y7 |apple
3 f5 N8 I! v8 t* O% Y, Y2 g8 qkiwi
: f: `8 x' i- m+ q  e4 L+ dorange
2 Z, Q) ?8 w; r  r4 s. Y' }1 j8 T8 Qwelcom to Hessian$ ^: [' C: Q! @7 [) m& U5 d- r8 l
my car name:[阿斯顿·马丁] model:[One-77]。; _" {+ L' S/ m4 E5 B! q" k8 s
daughter 孙小美1 ]% _( H# O; g5 y' F3 a
son 孙吴空0 I9 q2 K1 e/ V4 \
apple
0 {- C1 k0 {* U$ [( ?1 @% E) T8 y0 Mkiwi
/ C5 |& R  U8 P# [- c% n* g4 horange" t9 s7 J/ }5 C, V% r7 j. x
【二】、spring+hessian 实现服务端:
# }4 }% I# g- M& R1.基本代码见上面的demo. s# F3 u6 x( `& U8 k
2.修改配置文件0 ~4 ?2 T5 W* l8 a
在web.xml,增加内容如下:
1 A% M& Q& S$ r2 ^# rXml代码
3 h' s4 R' G+ b4 J《servlet》: x. ], v7 `* r
《servlet-name》springhessian《/servlet-name》
+ Q, \/ ]& D3 V2 L) e$ k1 p2 v《servlet-class》
- J! t" g5 Y) a: `3 `+ eorg.springframework.web.servlet.DispatcherServlet8 x7 Z& E/ W: b( X4 j; [
《/servlet-class》4 D& b6 K& ?* K& t
《!--% N6 R1 \: W# m! C. \) H
《init-param》
2 L! w: K2 M0 P9 @% U《param-name》contextConfigLocation《/param-name》5 I! k' H0 e/ v3 n; A
《param-value》/WEB-INF/springhessian-servlet.xml《/param-value》/ G6 o) X7 s% {5 R. I
《/init-param》: q4 P. F6 |% X. f7 W' ?
--》
; L2 W; O* O' X9 U- D* q《load-on-startup》1《/load-on-startup》5 b# {: e0 X0 V
《/servlet》% |; D( T7 c3 J/ i8 [# Y; H
《servlet-mapping》+ N; v( e" y3 O
《servlet-name》springhessian《/servlet-name》# q# `: T% p9 Z: }
《url-pattern》/springhessian/*《/url-pattern》4 _: ]; a& p0 }+ e& r5 y3 H
《/servlet-mapping》
. j4 K/ o# z0 b! U: r3 R《servlet》) C9 q6 h9 r' O9 o; d4 A
《servlet-name》springhessian《/servlet-name》8 ]. \" S' ?- F
《servlet-class》7 k  ]1 r8 d1 [* k1 n# a# c# R/ g
org.springframework.web.servlet.DispatcherServlet
9 h8 H" a5 Q5 t; n7 A《/servlet-class》
) _1 l3 e9 ]# ]) F" A* K5 K《!--# I1 a, K- `" Y) c! q1 Y5 g
《init-param》9 l$ |! f  K: J
《param-name》contextConfigLocation《/param-name》
1 t% A7 s3 X! \+ n  q《param-value》/WEB-INF/springhessian-servlet.xml《/param-value》
. e2 T7 x. }3 M) O  L5 ], o* s; Z《/init-param》# C- S) \0 {) R7 D1 |* A4 ]' g
--》- S$ U7 {+ j" t6 n
《load-on-startup》1《/load-on-startup》( Q0 ?/ [" q! }, s  G# x/ r8 e4 }# ^
《/servlet》* R7 \1 ~3 A! ]; \, H( n
《servlet-mapping》
- y) z( k" s: n- s, F《servlet-name》springhessian《/servlet-name》9 T0 S7 ]$ |% h# ^6 w6 E
《url-pattern》/springhessian/*《/url-pattern》: ]3 s6 p0 z* r
《/servlet-mapping》
" M0 M5 v5 t/ L  t- G% q在/WEB-INF/增加一个叫servlet-name-servlet.xml配置文件。该文件的命名有一定的规则,红色servlet-name需要和web.xml中的《servlet-name》springhessian《/servlet-name》定义的名称相匹配,比如本例子应叫springhessian-servlet.xml,这样简单也不容易出错。
7 D6 I  d1 x9 i* F/ v4 _% E6 }, J当然该文件也可以自己任意命名。如果是自定义的文件名称不符合上述默认的规则,需要在《servlet》中增加《init-param》相关属性,人为指定加载配置文件,否则会报错。
0 @/ }- {( t# ^% |: Z6 h范例:springhessian-servlet.xml$ Z; w( R, O& T% Z
Xml代码
, w' \, V5 E  I7 F$ A《?xml version=“1.0” encoding=“UTF-8”?》  s; k! e" B6 @8 U; Q- X8 N
《!DOCTYPE beans PUBLIC “-//SPRING//DTD BEAN//EN” “http://www.springframework.org/dtd/spring-beans.dtd”》
% @% W0 R3 L! a4 }/ G7 Y; S0 p《beans》" F4 N% u& j% A, F+ n  `+ ~9 }
《bean id=“helloHessianImpl”
4 _1 i, K  @2 e6 |1 @class=“michael.hessian.impl.HelloHessianImpl” /》
* F2 n5 I+ R$ d《!-- 使用HessianServiceExporter 将bean生成Hessian服务--》1 G4 k  N  |" P6 o5 ~8 w
《bean name=“/helloHessianService”6 Z' Z; }3 r# o6 Z$ d) _. _
class=“org.springframework.remoting.caucho.HessianServiceExporter”》$ K+ S2 h5 J2 R+ w
《!-- 定义需要生成服务的实现类--》
- o( [3 w" L3 V9 ]7 R0 X+ B《property name=“service” ref=“helloHessianImpl” /》
, Y( M% W0 m$ M; |《!-- Hessian 提供服务的接口--》: @8 j9 c& N+ Z
《property name=“serviceInterface”& i8 P1 Z5 Y' X  `
value=“michael.hessian.HelloHessian” /》' G; H" b% `) F
《/bean》
9 n- \0 U0 i. y0 |, B+ i7 W$ R7 [- L《/beans》; @, V% @7 l) f# R3 T
《?xml version=“1.0” encoding=“UTF-8”?》6 i0 |8 w  a9 r# E0 `
《!DOCTYPE beans PUBLIC “-//SPRING//DTD BEAN//EN” “http://www.springframework.org/dtd/spring-beans.dtd”》
& M' T3 T4 M  ]5 |- S- O# Q9 k! Z《beans》
+ {( t9 N  P& j& f% F0 I《bean id=“helloHessianImpl”8 C  X) C5 T/ O" {
class=“michael.hessian.impl.HelloHessianImpl” /》, S" l% M, C+ W$ O; n# J* C
《!-- 使用HessianServiceExporter 将bean生成Hessian服务--》
* U/ x& }* G4 O/ r3 h《bean name=“/helloHessianService”
8 w( i& L+ t2 o) Rclass=“org.springframework.remoting.caucho.HessianServiceExporter”》; R& d" _! a* H& [9 n% f, R$ D
《!-- 定义需要生成服务的实现类--》8 ~. ^$ L, b. q% M0 p7 u
《property name=“service” ref=“helloHessianImpl” /》7 B$ d6 d5 F) X( P5 I
《!-- Hessian 提供服务的接口--》
0 r1 @5 j  E9 |0 E《property name=“serviceInterface”- c' r! h6 e: E( Z
value=“michael.hessian.HelloHessian” /》
9 }6 I4 R' _( _. A( s. X' ^《/bean》0 O- U. T8 r, x" v. Y7 [6 v  w+ w
《/beans》
- e, u" w% G- T; u% [4 j7 x3.java客户端验证/ i  I/ N" c* A. l& {+ u
和上面的例子相似,只需要把访问的url替换成新的即可如下:2 k0 D& p, O% H9 o" [# F& C
Java代码
0 P6 h( o# w, o3 `6 }: j* i1 iString url=http://localhost:8082/J2EE_sjsky/springhessian/helloHessianService
3 N0 b. U1 O' K% lString url=http://localhost:8082/J2EE_sjsky/springhessian/helloHessianService
9 ~" i3 u5 ~. X" W运行结果和上面例子一样。* o& K$ o2 I) k2 y# {/ j
4.spring配置客户端7 Z  L( l& D. n! E. @& k
增加一个spring的bean配置文件hessian-client.xml
% ~& E6 D& {, b/ l* S1 fXml代码& I  K9 e/ q, u, t( W+ {
《?xml version=“1.0” encoding=“UTF-8”?》! a/ v( c4 v. g( A8 [& h! ?1 Z
《!DOCTYPE beans PUBLIC “-//SPRING//DTD BEAN//EN” “http://www.springframework.org/dtd/spring-beans.dtd”》# {6 l$ a6 N: Y0 y$ u
《beans》
2 {5 Q; j. h2 c' ~6 I4 P《bean id=“helloHessianClient”( H1 z- j6 L9 s, ?7 ?- L0 h
class=“org.springframework.remoting.caucho.HessianProxyFactoryBean”》  Q% R8 U( i# A
《property name=“serviceUrl”》9 i% Y$ X7 S: l; ?: ]9 _9 ?
《value》( G4 w, e. T- o7 u
http://localhost:8082/J2EE_sjsky/springhessian/helloHessianService
. ^* w7 U$ E9 q" i0 |  _) ?《/value》
7 N) S. L9 s$ n7 @《/property》
* c  @) I! B. c: F9 |/ x% W. V" Y《property name=“serviceInterface”7 D0 [4 E& X0 y7 b
value=“michael.hessian.HelloHessian” /》6 l1 I2 R2 J0 ^
《/bean》+ r9 r, V! }4 w3 d" _2 q; C' \
《/beans》! g" Q" C  H/ U$ U
《?xml version=“1.0” encoding=“UTF-8”?》# ^6 g3 P$ k5 u7 K2 {5 e' W3 F
《!DOCTYPE beans PUBLIC “-//SPRING//DTD BEAN//EN” “http://www.springframework.org/dtd/spring-beans.dtd”》8 J7 r0 k7 W7 @: T
《beans》
' a" n, i: N! u  P) {" {2 |《bean id=“helloHessianClient”2 O* k0 U' n9 U9 H
class=“org.springframework.remoting.caucho.HessianProxyFactoryBean”》
; E" G; [& f, ?! l6 ?& c1 w《property name=“serviceUrl”》% C& f! b  `# ]/ @0 @
《value》/ F8 c+ R4 |* l! `1 o% g
http://localhost:8082/J2EE_sjsky/springhessian/helloHessianService
6 d$ o  l+ |1 X8 f& p7 [《/value》% r& s; e: k! ?& ~2 t& ]8 e$ T
《/property》
. {+ ~( _. p+ O; s: i+ P/ F: _) H《property name=“serviceInterface”
! x- m# }6 R% r( e7 z/ D$ l+ ]( _value=“michael.hessian.HelloHessian” /》/ _* p; m3 l( @# {2 x1 |- P3 L/ H
《/bean》
! g, b7 w0 J4 O; f3 x/ y+ A《/beans》7 j1 j# G4 I! h4 }, L
测试代码HessianSpringClient.java:- u& P' H( z# `) p7 h
Java代码
" P2 I1 D" m2 z+ n* H  B1 O. J! apackage michael.hessian.client;: {5 j9 i, N% `% f
import java.util.Map;
8 x( g& l, k' a* |import michael.hessian.HelloHessian;
7 ]4 [. X/ M( `1 m  c( \4 @import michael.hessian.MyCar;9 v: z) a/ A: J7 k# U
import org.springframework.context.ApplicationContext;
6 _8 M# B& T- d. f* Fimport org.springframework.context.support.ClassPathXmlApplicationContext;
! d5 E) ]- _' J: J/**
' F5 _( q4 u$ k  y! x- j0 G4 S1 d* @author michael
( m! J2 B# J4 _*- A/ D" p5 @' U  i
*/
  R0 ^- v8 W  B4 C/ T5 g
. X: R8 r3 i& u' b$ g5 b3 R
+ e! a6 r* k' p9 B8 C, i4 ]" v. \public class HessianSpringClient {
# G' }4 v5 ?1 I+ V: x/**
& h, i2 E# ^4 A5 D9 q: h* @param args  T& ^, y; K( w" B
*/+ x* b7 l1 @. D* H7 d
public static void main(String[] args) {. p! O+ n5 ~0 `) S5 b
try {2 Q" Y$ d9 V0 M
ApplicationContext context = new ClassPathXmlApplicationContext(
3 R1 y2 P) H( w“hessian-client.xml”);3 }+ G( F3 F7 i
HelloHessian hello = (HelloHessian) context8 N- x! J! T: p1 j5 O6 h/ F% r" r! ^2 w
.getBean(“helloHessianClient”);( ^. a2 B/ N# Z) P* N
System.out.println(hello.sayHello());( C/ l9 S+ W/ @: z: _( n
MyCar car = hello.getMyCar();
, a, s- G: Y3 \4 @4 L  }System.out.println(car.toString());
2 L7 J2 V  F! [+ mfor (Map.Entry《String, String》 entry : hello.myBabays().entrySet()) {
0 D0 F( S& I) C' M( @, T1 e4 QSystem.out.println(entry.getKey() + “ ” + entry.getValue());4 M5 M' X/ [; M0 I% ~
}
3 B. R% g3 b- [) Q+ ifor (String str : hello.myLoveFruit()) {
6 G# x: X- c" T4 KSystem.out.println(str);
! p/ X5 }3 }* e0 W$ J* t* i- ?/ A}+ {7 i% k! H3 ~) @
} catch (Exception e) {( j; ?4 u& P& S9 u4 p+ _; C! X, e
e.printStackTrace();
, O. V$ O1 d8 ~9 Z2 y& Y4 d% f8 h6 ]}( P# A$ J+ H9 I. M1 m
}' b1 q! V+ ]' r* }+ v! k0 p
}8 f& ~6 G& |7 i$ H, P
package michael.hessian.client;
1 ]5 p9 m: e1 Qimport java.util.Map;  i- N  Q* S* ^9 ~" |
import michael.hessian.HelloHessian;& S( b( P' V/ w* n+ s/ {8 r
import michael.hessian.MyCar;! h9 R9 p5 K4 m4 Z5 K
import org.springframework.context.ApplicationContext;. F3 q& l0 m' w. n* m/ p  N
import org.springframework.context.support.ClassPathXmlApplicationContext;2 I+ R7 R1 ^$ L1 f- H
/**9 h7 Q; A& r" o4 P+ r7 g
* @author michael
7 d7 b" ]" T1 b& j1 E! b" e( p  g+ _*0 r$ S- ^" b; u  _$ i( R
*/4 X9 h4 u/ @2 w0 K2 y& u
public class HessianSpringClient {
  K$ e; k7 U' M5 w- {- v  a/**
& w7 Y3 q4 [; g5 \2 d7 T6 Q* @param args* X5 e" W3 d2 l4 l5 q, }( O
*/
7 ~& T" e, [9 B( ]public static void main(String[] args) {: g$ F7 l* L, j: e% U
try {
9 [; k( Q1 y* H, S5 s! DApplicationContext context = new ClassPathXmlApplicationContext(
" N5 n. k. B* q9 L“hessian-client.xml”);
/ i: e' Q& z& S3 C+ a' n$ \* y0 G6 THelloHessian hello = (HelloHessian) context
7 D5 i" i- z+ P: n.getBean(“helloHessianClient”);
3 I1 G2 G2 ^% |# j' zSystem.out.println(hello.sayHello());) n- `- G0 k% j
MyCar car = hello.getMyCar();
2 C& Q! j% _- Z" W( ~3 SSystem.out.println(car.toString());$ R" {' E2 o/ C0 z) q  k5 B( c2 J1 ]
for (Map.Entry《String, String》 entry : hello.myBabays().entrySet()) {
0 a2 x+ |. ]# q) J; OSystem.out.println(entry.getKey() + “ ” + entry.getValue());
# K# X  U& O7 N- B}
, N: b5 V2 Y/ ]/ U& D1 [3 Q5 G& Kfor (String str : hello.myLoveFruit()) {
% F: B/ q$ z; R0 I5 i0 iSystem.out.println(str);
- A+ r2 }5 x5 g& O' k, M}$ ]2 w8 [1 d( n
} catch (Exception e) {
7 g9 c3 Z* @2 N1 t3 E; Y: U; fe.printStackTrace();
% d' F8 S7 y% s# @}
6 x  ~/ [& m5 c" m+ \4 o3 ~6 E}
# l1 h4 a; \# W; O2 n8 D* D}7 z7 f9 `/ t1 Y, U7 _8 F
运行结果和上面完全一致8 J- [* E$ k/ k: ~  Y' i1 H5 w% w
5.com.caucho.hessian.io.HessianProtocolException: expected string at 0x6d异常处理/ t( H( |4 ~' g
我在spring+hessian整合测试过程中,客户端调用时,发生了异常,而服务端错误内容如下:# L: e7 d5 S' p
Java代码1 u# L, y8 ^4 j! Q
2011-4-25 16:14:44 org.apache.catalina.core.StandardWrapperValve invoke! {( F/ C8 P8 @# v
严重: Servlet.service() for servlet remoting threw exception
) q3 t6 u, L6 R+ y; ?3 C4 V5 Ucom.caucho.hessian.io.HessianProtocolException: expected string at 0x6d
9 D  F, x2 d: \at com.caucho.hessian.io.Hessian2Input.error(Hessian2Input.java:2882)
* C+ r; d6 o9 z7 _0 Fat com.caucho.hessian.io.Hessian2Input.expect(Hessian2Input.java:2830)- f* \' ?6 E6 C! G$ q4 W
at com.caucho.hessian.io.Hessian2Input.readString(Hessian2Input.java:1362)/ {6 h! w# E/ _& N
at com.caucho.hessian.io.Hessian2Input.readMethod(Hessian2Input.java:272)
/ }( D: x0 ~3 W/ C: ?" b7 {9 Tat com.caucho.hessian.server.HessianSkeleton.invoke(HessianSkeleton.java:249)
" m# E: s. X& d* xat com.caucho.hessian.server.HessianSkeleton.invoke(HessianSkeleton.java:221); b) `' |" a8 |& ~
at org.springframework.remoting.caucho.Hessian2SkeletonInvoker.invoke(Hessian2SkeletonInvoker.java:67): m2 a1 A" w- E
at org.springframework.remoting.caucho.HessianServiceExporter.handleRequest(HessianServiceExporter.java:147)
2 [" Z9 j  p5 y5 Iat org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:49)
) @  c7 w$ j# u8 s0 vat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:819)1 R+ N# Q1 A' `3 g( l2 K2 r# n2 Y
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:754)
' O& M* m; s! O" A! t4 U6 hat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:399), }  o. L$ V- M; |/ g, |
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:364)
; D& F  F/ Z; r! \5 T6 Y0 Bat javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
* y5 f6 R3 T7 d( S0 x! T0 w3 ?at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)& P; b/ X( s! j& n/ n
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
- l$ H" |; M& H4 N9 uat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)/ U+ L, W. F7 U$ t5 g
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)* C) R- T; L' b- P
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
3 V' n" U7 N! Y# C) H8 c+ n. yat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
6 g$ j% A/ E, E4 t- u; [5 `  hat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)5 D7 t# l/ ~6 Q9 P# ]8 ^4 e5 U
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)2 P6 g: i7 R! y
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)  K" t! \1 i5 H! Z
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
( y! F. @/ x! S, M, A: Z" oat org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
5 V8 M2 v* M  Oat org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
4 H4 j+ c9 C. n$ ^2 v* z" ^; h' Jat java.lang.Thread.run(Thread.java:619). n* b. E) `1 n# [) z2 _/ w
2011-4-25 16:14:44 org.apache.catalina.core.StandardWrapperValve invoke
3 h  i; e+ L# D+ {. o  O严重: Servlet.service() for servlet remoting threw exception2 ~4 g8 d* s" f& [- H
com.caucho.hessian.io.HessianProtocolException: expected string at 0x6d% z. Q; r" m0 u& T
at com.caucho.hessian.io.Hessian2Input.error(Hessian2Input.java:2882)
) G, v- j8 j" q0 J( y. w9 y) e4 Mat com.caucho.hessian.io.Hessian2Input.expect(Hessian2Input.java:2830)
4 X" g& q! c! x' Nat com.caucho.hessian.io.Hessian2Input.readString(Hessian2Input.java:1362)  Q2 B; C1 S  P% ]: v: o6 y, K
at com.caucho.hessian.io.Hessian2Input.readMethod(Hessian2Input.java:272)
5 R1 E# O. p& f6 D( [7 ^' }7 ]at com.caucho.hessian.server.HessianSkeleton.invoke(HessianSkeleton.java:249)
+ p7 x: k; [# m0 n3 s' jat com.caucho.hessian.server.HessianSkeleton.invoke(HessianSkeleton.java:221)2 S9 [5 Z$ @6 M6 ?, R% p$ c
- ?( l" @  l7 J( \3 m3 C$ D

% i: v+ t3 E2 F' s# M3 zat org.springframework.remoting.caucho.Hessian2SkeletonInvoker.invoke(Hessian2SkeletonInvoker.java:67)
! B$ [1 y' y$ c; P9 M3 zat org.springframework.remoting.caucho.HessianServiceExporter.handleRequest(HessianServiceExporter.java:147); M4 i; D  n- l& m2 n$ Z
at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:49)
- h( s, Y3 c; [1 Y/ g+ A6 xat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:819)
' V: }2 b1 Q) C9 R7 V8 ]5 zat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:754)
7 _+ G2 Y$ Y! b8 m' Nat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:399)1 s" W, m: O0 S" }0 x" c
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:364)
4 f) c9 z: h. e) R' A: ~3 hat javax.servlet.http.HttpServlet.service(HttpServlet.java:710); S) e: B2 y  \) U5 W
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
6 K! q/ e- y/ s8 \- p* v- Bat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)  K# w3 `! }' v/ J7 c& K( v, a
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
8 M) {0 |! A5 c, R  \3 sat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)/ R6 r# u$ D9 ?/ c
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)# a' m7 X) m$ I6 r; [
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
& c' D1 i8 G0 O0 X7 Nat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
, k* A; y& {8 J/ ^! yat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
- z$ b$ I) q( b5 [: b8 N% eat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261): j% B9 @. D# r* I* x7 S. K
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)/ y, s; Y3 O4 x" V8 U3 z2 b' W. {8 s# X
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
5 V6 K% D5 X' s) \9 dat org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
) R: {1 b$ ]; B  `2 i! [at java.lang.Thread.run(Thread.java:619)9 D! T$ B( p1 O: n
经查资料发现原始是hessian和spring的版本不兼容引起的,重新下载hessian-3.1.6.jar导入项目,一起运行正常,测试完全通过。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-26 08:31 , Processed in 0.282329 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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