`

java的transient和@Transient注解的区别及hessian传输怪现象

阅读更多
@Transient
private  String strOrderAmt;//可以通过hessian传输,且不参与hibernate操作

transient private String strOrderAmt2;//不可以通过hessian传输,也不参与hibernate操作

 

另外,hessian传输对象时有一个奇怪问题,

当一个Vo对象在hessian方法调用时,被放到不同的方法形参里,则hessian会报错,这时只能用transient关键字对某个实参里的Vo对象取消序列化才可以

如下:

public class BasBatchPayOrderTask implements Serializable {
	@Transient
	private List<BasBatchPayOrderDtl> orderList;
}
//hessian不能传输,会报错,
service.saveBatchFlow(task, task.getOrderList());

//或者第二个形参置为null,hessian能传输
service.saveBatchFlow(task, null);

 

 

或者

//或者把@Transient改成transient
public class BasBatchPayOrderTask implements Serializable {
	transient private List<BasBatchPayOrderDtl> orderList;
}

//hessian能传输
service.saveBatchFlow(task, task.getOrderList());

 

 另外,在做子订单大于49999.99拆单时,发现拆单金额(BigDecimal类型)如果被多个子订单引用,则hessian不能传输,会抛异常

 

private BigDecimal singleMaxAmount = new BigDecimal("49999.99"); 


// 未切割金额大于singleMaxAmount
 if (unsplitAmt.compareTo(singleMaxAmount)>0) {
     extOrderVo.setOrderAmt(singleMaxAmount);//不能传输,因为singleMaxAmount被多次引用
     extOrderVo.setOrderAmt(new BigDecimal(singleMaxAmount.toString()));//正确写法,新new一个对象
 } else {// 未切割金额小于等于singleMaxAmount
     extOrderVo.setOrderAmt(unsplitAmt);
 }

 

最后,hessian传输总结如下:

 

hessian传输数据(范围包括方法上的全部形参)里的任何class对象(包括BigDecimal)只能存在一个引用,如果有两个以上引用则不能传输,会报异常

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics