基于注释的请求验证

时间:2012-03-26 11:19:55

标签: java validation bean-validation

我正在尝试验证请求中的数字变量,我正在尝试实现,此字段为非null和数字。我希望针对null和转换错误报告不同的错误。

我试图使用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?

提前致谢:)

1 个答案:

答案 0 :(得分:1)

没有错过 - 验证只是比你需要的更简单,Spring只支持消息资源包作为i18n工具。

因此,对于您的特殊情况 - 可能不是很特别 - 您需要特殊的实施。

此外,无法保证验证顺序。每个验证必须处理它不处理的所有情况(因此数字验证必须使用空值和空值,因为其他验证将检查)。

我认为,基于注释的验证对于非常简单的hello-world类型案例(如@NotNull@NotEmpty)非常有用。对于其他所有内容,我更喜欢commons validator加上我自己的注释,因为这样我就可以定义应用程序所需的模式和常用验证,并在必要时以定义的顺序运行它们。