弹簧形式验证 - 不显示错误

时间:2013-07-21 17:16:15

标签: spring validation spring-mvc

我有以下情况: 我尝试创建一个简单的表单来编辑有关电影的信息。因此我使用spring mvc和jsp。

对于验证,我使用JSR 303 hibernate实现(hibernate-validator 4.2.0)。

我的问题是如果有验证错误(BindResults hasErrors方法返回true)我只能用

显示错误
<form:errors path="*" />

不是特定于字段的。喜欢:

<form:errors path="title" />

我不知道为什么但是所有错误都显示在path =“*”errortag中,但没有显示在特定于字段的错误中。显示在该字段右侧的唯一错误是一些带来异常的错误,即

Failed to convert property value of type java.lang.String to required type int for property runtime; nested exception is java.lang.NumberFormatException: For input string: "")

我的jsp文件的重要部分如下所示:

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>

<form:form commandName="movie">
    <fieldset>
        <form:errors path="*" cssClass="formErrorBlock"/>
        <table>
            <tr>
                <td><form:label path="title">Title:</form:label></td>
                <td>
                    <form:input path="title"/>
                    <form:errors path="title" cssClass="formFieldError"/>
                </td>
            </tr>
            <tr>
                <td><form:label path="runtime">Runtime:</form:label></td>
                <td>
                    <form:input path="runtime"/><br />
                    <form:errors path="runtime" cssClass="formFieldError" />
                </td>
            </tr>
            <tr>
                <td><form:label path="imdbId">IMDB-ID:</form:label></td>
                <td>
                    <form:input path="imdbId"/><br />
                    <form:errors path="imdbId" cssClass="formFieldError" />
                </td>
            </tr>
            <tr>
                <td></td>
                <td>
                    <input type="submit" />
                </td>
            </tr>
        </table>
    </fieldset>
</form:form>

我的控制器:

@Controller
public class MovieController {

@Autowired
private MovieService _movieService;

//some other methods...

@RequestMapping(value="/movie/{pMovieId}/edit", method = RequestMethod.GET)
public String showForm(ModelMap pModel, @PathVariable Integer pMovieId) {
    Movie movie = _movieService.getMovieById(pMovieId);

    pModel.addAttribute("movie", movie);

    return "edit/movie";
}


@RequestMapping(value="/movie/{pMovieId}/edit", method = RequestMethod.POST) 
public String editMovieSave(@Valid Movie pMovie, BindingResult pResult, @PathVariable Integer pMovieId, ModelMap pModel) {
    Movie movie = _movieService.getMovieById(pMovieId);

    if(pResult.hasErrors()) {
        return "edit/movie";
    }

    //save

    //redirect to moviepage
    return "redirect:/movie/" + pMovieId;
}

}

最后是我的电影课:

public class Movie implements Serializable{

private int _id;
@NotEmpty
@Size(min=3)
private String _title;
@NotEmpty
private String _filename;
@Pattern(regexp="tt+[0-9]{7}")
private String _imdbId;
@Min(value=1)
private int _runtime;

//getters and setters....

}

我知道这个问题之前已被问过很多次,但没有一个答案适合我。

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

我通过重命名属性(删除下划线)解决了这个问题。然而,就像“jpprade”所说的那样(也许有反思可以访问)。

对于那些无法重命名类属性的人(如果有一些编码方案,......)可以注释getter方法。