【问题标题】:Java spring framework form validationJava Spring框架表单验证
【发布时间】:2011-10-08 17:51:53
【问题描述】:

我正在使用 spring 框架 3.0.5。

我有一个表格:

<form:form method="POST" modelAttribute="postedEntry">
    Category: <form:select path="category" items="${menus}" itemValue="id" itemLabel="menuName"/><form:errors path="category"/>
    <br/>Title: <form:input path="title"/><form:errors path="title"/>
    <br/>Short Description: <form:textarea path="shortDesc"/><form:errors path="shortDesc"/>
    <br/>Body: <form:textarea path="body"/><form:errors path="body"/>
    <br/><input type="submit" value="POST IT!11"/>
</form:form>

还有一个域类Entry:

public class Entry {
    private int id;
    private int category;
    private String title;
    private String shortDesc;
    private String body;
    private Date date;
//getters and setters
}

还有一个控制器:

@RequestMapping(value="/entryPost",method=RequestMethod.POST)
public String entryPost(@ModelAttribute("postedEntry") Entry entry,BindingResult result){
    entryValidator.validate(entry, result);
    if(result.hasErrors()){
        return "entryPost";
    }else{
        rusService.postEntry(entry);
        return "redirect:entryPost";
    }
}

在我的服务对象中:

public void postEntry(final Entry entry){
    String sql = "INSERT INTO entries (category,title,shortDesc,body,date) VALUES(?,?,?,?,?)";
    jdbcTemplate.update(sql,new Object[]{entry.getCategory(),entry.getTitle(),entry.getShortDesc(),entry.getBody(),entry.getDate()});
}

还有一个验证器:

public class EntryValidator implements Validator{
    public boolean supports(Class clazz){
        return Entry.class.isAssignableFrom(clazz);
    }
    public void validate(Object target,Errors errors){
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "category", "required.category","Category is required!");
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "title", "required.title", "Title is required!");
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "shortDesc","required.shortDesc", "Short description is required!");
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "body", "required.body", "Body is required!");
        Entry entry = (Entry) target;
        entry.setDate(new Date());
    }
}

如果有人发送一个类别的字符串值,而不是整数,它将在表单附近键入: 无法将 java.lang.String 类型的属性值转换为属性类别所需的 int 类型;嵌套异常是 org.springframework.core.convert.ConversionFailedException:无法将值“h”从 java.lang.String 类型转换为 int 类型;嵌套异常是 java.lang.NumberFormatException: For input string: "h"

但我不希望它输入这个。我怎样才能以某种方式验证这个值并抛出我自己的消息? 我尝试通过添加以下内容在我的验证器中检查它:

int cat = entry.getCatrgory();
if(cat.equals("0"))
    errors.reject("invalid.category","The category is invalid!");

但它不起作用 - 它仍然抛出 ConversionFailedException 异常。

【问题讨论】:

    标签: java forms model-view-controller spring validation


    【解决方案1】:

    您可以在资源包中使用typemismatch 键。

    例子:

    typeMismatch = This is not a number!
    

    【讨论】:

      【解决方案2】:

      您需要为错误消息声明message source。然后您可以在其中指定类型不匹配错误的消息,如下所示:JSR-303 Type Checking Before Binding(也可以在其中指定其他错误消息)。

      【讨论】:

        猜你喜欢
        • 2011-11-01
        • 2010-09-28
        • 1970-01-01
        • 1970-01-01
        • 2011-07-08
        • 2015-08-07
        • 2012-04-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多