如何使用Spring Validator JSR 303动态解析消息属性值?

时间:2017-04-27 11:30:25

标签: spring-mvc bean-validation hibernate-validator

我正在使用带有注释的Spring Validator(JSR 303),并希望在错误消息中解析属性(idEnveloppe)值。考虑这个简单的场景:

@NotEmpty(message = "GCE-COT-DTC-RJFLX03 La donnée &idEnveloppe du bloc entête du flux de cotisation DSN n'est pas renseignée")
@NotNull(message = "GCE-COT-DTC-RJFLX03 La donnée &idEnveloppe du bloc entête du flux de cotisation DSN n'est pas renseignée")
@Pattern(regexp = "[0-9]{14}", message = "GCE-COT-DTC-RJFLX04 La donnée '${idEnveloppe}' du bloc entête du flux de cotisation DSN n'est pas valide}")
private String idEnveloppe;

打印错误:

private BindingResult bindAndValidate(final DsnCotFluxDto item) {

    DataBinder binder = new DataBinder(item);
    binder.setValidator(validator);
    binder.validate();
    // LOG.error(binder.getErrors().getBindingResult().toString());

    return binder.getBindingResult();

}

/**
 * Etude du cas des erreurs
 * @param results résultat des validations
 * @param item
 * @throws BusinessException
 */
private void buildValidationException(final BindingResult results, final DsnCotFluxDto item) throws BusinessException {
    StringBuilder msg = new StringBuilder();
    String code;
    String message;
    String rejectedValue;


    for (ObjectError error : results.getAllErrors()) {

        code = error.getDefaultMessage().substring(0, 19);
        message = error.getDefaultMessage().substring(20);
        // rejectedValue = error.getObjectName().getRejectedValue();

        msg.append("\n\t  \t---Error code : -- " + code + " ---Error message : --" + message + "\n");
        LOG.warn("\n\t  \t---Error code : -- " + code + " ---Error message : --" + message + "\n");
    }

    // throw new ValidationException(msg.toString());
}

谢谢

2 个答案:

答案 0 :(得分:2)

以下是documentation的引用:

  

从Hibernate Validator 5(Bean Validation 1.1)开始,可以在约束违规消息中使用统一表达式语言(由JSR 341定义)。 [...]验证引擎在EL上下文中提供以下对象:

     
      
  • 名称validatedValue
  • 下的当前验证值(属性,bean,方法参数等)   

所以,请尝试以下方法:

@Pattern(regexp = "[0-9]{14}", message = "GCE-COT-DTC-RJFLX04 La donnée '${validatedValue}' du bloc entête du flux de cotisation DSN n'est pas valide}")

答案 1 :(得分:0)

我用它来获取它们

 rejectedValue = ((FieldError) error).getRejectedValue().toString();

我将它们插入消息字符串后,如:

  message = new StringBuilder(message).insert(10, rejectedValue).toString();

它工作正常

谢谢