使用XFire进行ws调用中,发生了No write method for property问题,看了下代码发现问题如下:
服务器端的接口信息如下:
public interface QueryFacade {
public QueryResult queryById(String id);
}
其中的QueryResult代码如下:
public class QueryReslt implements Serializable{
private static final long serialVersionUID = 3688506614705500726L;
// 状态量
private int page; // 当前页码。(1-based)
private int items; // 总共项数
private int itemsPerPage; // 每页项数。
public int getPages() {
return (int) Math.ceil((double) items / itemsPerPage);
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page =page;
}
public int getItems() {
return items;
}
public void setItems(int items) {
this.items = items;
}
public int getItemsPerPage() {
return itemsPerPage;
}
public void setItemsPerPage(int itemsPerPage) {
this.itemsPerPage = itemsPerPage;
}
}
在QueryResult对象中,有一个 getPages() 方法,但其实pages并不是该对象的属性。问题就出在这里了。
使用xfire的ws调用时,会将对象与xml进行捆绑。整体的大概流程是:
1、 通过传递对象的get、is方法获取需要传递的属性(属性私有)
2、 与xml捆绑并网络传输
3、 解绑参数,并调用set方法将参数设置进去。
因此,虽然getPages()只是一个方法,还是会被误以为是属性并与xml进行捆绑,在客户端当做属性进行解绑,并调用setPages进行设置时,发现没有该方法,就跑出了一个异常。
这种实现确认很容易让人中招。。
在不改动源代码的情况下,我们在使用xfire中就得绕过这个坑:
1、如果你需要传递某些属性,一定要同时定义它的get、set方法,否则会丢失这些信息
2、自定义的方法名不要使用get打头的方法名,否则会被识别为属性并调用set设值,这样就会抛错了