在spring service 层中使用多种validator

摘要: 用spring mvc 开发应用程序,一般会在controller层中配置validator  进行数据校验,但这种情况只适合用于只有一种固定的校验方式,但实际上,校验可能是很灵活的,比如一个单据,在保存提交的时候,单据相关的内容的校验是一种方案,一旦保存成功,就多了单号,然后可能是另外一种校验方案,可能这个例子不是很恰当,但一个中心思想就是,在同一个实体类上的校验,可能存在多种规则,需要选择那一种规则,由程序员自己决定:

用spring mvc 开发应用程序,一般会在controller层中配置validator 进行数据校验,但这种情况只适合用于只有一种固定的校验方式,但实际上,校验可能是很灵活的,比如一个单据,在保存提交的时候,单据相关的内容的校验是一种方案,一旦保存成功,就多了单号,然后可能是另外一种校验方案,可能这个例子不是很恰当,但一个中心思想就是,在同一个实体类上的校验,可能存在多种规则,需要选择那一种规则,由程序员自己决定:

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
    }
  }

}


这样就根据不同的条件做不同的校验.

上一篇: javascript 内置对象 math,global
下一篇: 在JSP中如果很长的网址怎么缩短呢
 评论 ( What Do You Think )
名称
邮箱
网址
评论
验证
   
 

 


  • 微信公众号

  • 我的微信

站点声明:

1、一号门博客CMS,由Python, MySQL, Nginx, Wsgi 强力驱动

2、部分文章或者资源来源于互联网, 有时候很难判断是否侵权, 若有侵权, 请联系邮箱:summer@yihaomen.com, 同时欢迎大家注册用户,主动发布无版权争议的 文章/资源.

3、鄂ICP备14001754号-3, 鄂公网安备 42280202422812号