在spring service 层中使用多种validator

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

public interface orderService {
  public orderTO placeOrder(@Valid orderTO orderToPlace);
}


public class orderTO {

  @NotNull
  @Size(min=1)
  private List<ItemTO> 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<ItemTO> 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<ConstraintViolation<OrderTO>> requestViolations = validator.validate(placeOrderTO, PlaceOrderRequest.class);

    boolean requestHasViolations = !requestViolations.isEmpty();

    if(requestHasViolations ){
      // ... handle constraint violations
    }

    // ... do business logic

    orderTO placedOrderTO = ... ;
    
     Set<ConstraintViolation<OrderTO>> responseViolations = validator.validate(placedOrderTO, PlaceOrderResponse.class);
     boolean responseHasViolations = !responseViolations.isEmpty();

    if(responseHasViolations){
      // ... handle constraint violations
    }
  }

}


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

除非申明,文章均为一号门原创,转载请注明本文地址,谢谢!
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: spring validator
相关日志:
评论: 0 | 引用: 0 | 查看次数: -
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.