- 第一中情况:
- interface A {
- void getSomething(String str1);
- void getSomething(String str1,String str2)
- void getSomething(String str1, String str2, int int3)
- }
- 接口实现:
- class AImpl implements A {
- public void getSomething(String str2){
- // do something
- }
- public void getSomething(String str1,String str2){
- // do something
- }
- public void getSomething(String str1,String str2,int int3){
- // do something
- }
- }
- 由于hessian 服务端是通过反射机制加载实现类的,所以在客户端调用这种方法重载的方式,会得到非预期的效果.
- 这也提示我们,接口的设计应该功能区分开来,语意清晰,解决办法就是修改方法名,让他们看起来不同。
- 第二种情况:
- interface A {
- void getSomething(DataParam data);
- }
- public class DataParam implements Serializable{
- private String name;
- private String value;
- public DataParam( String name, String value) throws IllegalArgumentException {
- //我们这里,想对客户端传过来的参数进行正确性验证,如果不通过就抛出异常
- if (name == null || value ==null)
- {
- throw new IllegalArgumentException("name and value musn't be null ");
- }
- this.name = name;
- this.value = value;
- }
- }
- 接口实现:
- class AImpl implements A {
- public void getSomething(DataParam data){
- // do something
- }
- }
- 客户端使用
- HessianProxyFactory factory = new HessianProxyFactory();
- A action = (A) factory.create( A.class, url);
- DataParam data = new DataParam("xiaog","code");
- A.getSomething(data);
- 这时候,服务器端会抛出异常,为什么呢?因为还是java反射机制导致的,
- 当客户端请求的时候,hessian服务端会通过反射去初始化对象,
- 初始化DataParam 的时候,我们是做了参数验证,这时候name和value是为null的,所以就抛出了异常。
- 怎么解决呢? 在 DataParam 类中添加一个默认的构造函数,同时在setName,setValue方法中去做参数的验证。
- //该片段来自于http://www.codesnippet.cn/detail/271220121229.html
来源: http://www.codesnippet.cn/detail/271220121229.html