2012-03-26 65 views
0

我试图验证请求中的数字变量,我试图实现的,此字段是非空和数字。我想为空和转换错误报告不同的错误。基于注释的请求验证

我试图用org.springframework.format.annotation.NumberFormat

为什么不@NumberFormat没有默认的邮件属性?这有没有原因被遗漏?我现在必须定制它,因为我没有使用消息资源包。

public class AddToJobsShortListWSRequest implements Serializable { 

@NumberFormat(style = NumberFormat.Style.NUMBER) 
@NotNull(message="ASL01") 
private Long userDetailId; 

控制器

public ResponseEntity<String> handlePostRequest(String xmlRequest, String... externalIds) { 

    ResponseEntity<String> response = null; 
    Set<Enum> enums = new HashSet<Enum>(); 
    AddToJobsShortListWSRequest addToJobsShortListWSRequest = serializationDeserializationSupport.fromString(xmlRequest, AddToJobsShortListWSRequest.class); 

    if(!jsonRequestValidator.validate(AddToJobsShortListWSError.class, enums, addToJobsShortListWSRequest)) 
    { 
     response = getBadRequestErrorResponseEntity(enums); 
    } 
    else{ 
..... 
} 

验证

private void validate(@SuppressWarnings("rawtypes") Class enumClass, Object object, @SuppressWarnings("rawtypes") Set<Enum> enums) { 
    BindException errors = new BindException(object, "object"); 

    validator.validate(object, errors); 

    @SuppressWarnings({"rawtypes"}) 
    List fieldErrors = errors.getFieldErrors(); 

    for (int i = 0; i < fieldErrors.size(); i++) { 
     if (fieldErrors.get(i) instanceof FieldError) { 
      String m = ((FieldError) fieldErrors.get(i)).getDefaultMessage(); 
      enums.add(Enum.valueOf(enumClass, m)); 
     } 
    } 
} 

是否有任何其他基于注解的验证适用吗? 另外,验证的顺序是什么,哪一个先踢,NumberFormat,NotNull?提前:)

+0

你可以发布控制器的代码和错误消息吗? – 2012-03-26 11:22:24

+0

可能是http://stackoverflow.com/questions/149506/annotation-based-spring-bean-validation的重复问题 – kandarp 2012-03-26 11:25:00

回答

1

由于它没有错过 - 验证只是更加简单比你需要和Spring只支持消息的资源包的国际化设施。

因此对于你的特殊情况 - 它可能不是特别的 - 你需要一个特殊的实现。

也没有保证的验证顺序。每个验证必须处理所有它不处理的情况(所以数字验证必须使用空值和空值,因为其他验证会检查它)。例如,我可以找到基于注释的验证,可用于非常简单的hello-world类型案例,如@NotNull@NotEmpty。对于其他一切,我更喜欢commons validator加上我自己的注释,因为这允许我定义我需要的应用程序的模式和常见验证,并在必要时按照定义的顺序运行它们。

+0

你是对的,我刚刚意识到,如果是这样的话 - Spring只支持消息资源包作为i18n设施。所以这是不同于jsr-303 谢谢 – 2012-03-26 15:15:08