在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 ListorderItems; @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 ListorderItems; @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