在spring service 层中使用多种validator
By:Roy.LiuLast updated:2013-08-15
用spring mvc 开发应用程序,一般会在controller层中配置validator 进行数据校验,但这种情况只适合用于只有一种固定的校验方式,但实际上,校验可能是很灵活的,比如一个单据,在保存提交的时候,单据相关的内容的校验是一种方案,一旦保存成功,就多了单号,然后可能是另外一种校验方案,可能这个例子不是很恰当,但一个中心思想就是,在同一个实体类上的校验,可能存在多种规则,需要选择那一种规则,由程序员自己决定:
采用了jsr-303的 @valid 标注。 在订单的保存前与保存之后,是不同的状态的,所以有一些校验规则也是不同的。比如在订单保存之后,必须存在 placedDate和orderNumber, 而在保存之前,是允许为空的。所以我们需要多种校验规则,然后jsr-303 只支持 group 方式,而且必须定义成类或者接口. 所以现在实体类代码改成如下:
现在可以写具体的实现类了
这样就根据不同的条件做不同的校验.
public interface orderService {
public orderTO placeOrder(@Valid orderTO orderToPlace);
}
public class orderTO {
@NotNull
@Size(min=1)
private List orderItems;
@Min(0)
private int customerNumber;
@Null
private Date placedDate;
@Null
private Integer orderNumber;
public orderTO(){;
}
// ... getter and setter methods
}
采用了jsr-303的 @valid 标注。 在订单的保存前与保存之后,是不同的状态的,所以有一些校验规则也是不同的。比如在订单保存之后,必须存在 placedDate和orderNumber, 而在保存之前,是允许为空的。所以我们需要多种校验规则,然后jsr-303 只支持 group 方式,而且必须定义成类或者接口. 所以现在实体类代码改成如下:
public interface PlaceOrderRequest {}
public interface PlaceOrderResponse {}
public class orderTO {
@NotNull(groups={PlaceOrderRequest.class, PlaceOrderResponse.class})
@Size(min=1,groups={PlaceOrderRequest.class, PlaceOrderResponse.class})
private List orderItems;
@Min(value=0, groups={PlaceOrderRequest.class, PlaceOrderResponse.class})
private int customerNumber;
@Null(groups={PlaceOrderRequest.class})
@NotNull(groups={PlaceOrderResponse.class})
private Date placedDate;
@Null(groups={PlaceOrderRequest.class})
@NotNull(groups={PlaceOrderResponse.class})
@Min(value=0,groups={PlaceOrderResponse.class})
private Integer orderNumber;
public orderTO(){;
}
// ... getter and setter methods
}
现在可以写具体的实现类了
public class orderServiceImpl implements orderService {
public orderTO placeOrder(OrderTO placeOrderTO){
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set> requestViolations = validator.validate(placeOrderTO, PlaceOrderRequest.class);
boolean requestHasViolations = !requestViolations.isEmpty();
if(requestHasViolations ){
// ... handle constraint violations
}
// ... do business logic
orderTO placedOrderTO = ... ;
Set> responseViolations = validator.validate(placedOrderTO, PlaceOrderResponse.class);
boolean responseHasViolations = !responseViolations.isEmpty();
if(responseHasViolations){
// ... handle constraint violations
}
}
}
这样就根据不同的条件做不同的校验.
From:一号门
Previous:javascript 内置对象 math,global
Next:在JSP中如果很长的网址怎么缩短呢

COMMENTS