我有以下情况: 我尝试创建一个简单的表单来编辑有关电影的信息。因此我使用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....
}
我知道这个问题之前已被问过很多次,但没有一个答案适合我。
感谢您的帮助
答案 0 :(得分:0)
我通过重命名属性(删除下划线)解决了这个问题。然而,就像“jpprade”所说的那样(也许有反思可以访问)。
对于那些无法重命名类属性的人(如果有一些编码方案,......)可以注释getter方法。