0

I have following situation: I try to create a simple form to edit information about a movie. Therefor I use spring mvc with jsp.

For the validation I use the JSR 303 hibernate implementation (hibernate-validator 4.2.0).

My problem is that if there are validation errors (BindResults hasErrors method returns true) I can only display the errors with

<form:errors path="*" />

and not fieldspecific. like with:

<form:errors path="title" />

I have no idea why but all errors are displayed in at the path="*" errortag, but none at the fieldspecific ones. The only errors which are displayed right to the field are some which brought an exception i.e.

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: "")

the important parts of my jsp file look like this:

<%@ 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>

My Controller:

@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;
}

}

and finally my movie class:

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....

}

I know this question has been asked a lot of times before, but none of the answers worked with me.

thanks for your help

4

1 回答 1

0

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

对于那些不能重命名类属性的人(在某些编码约定的情况下,......)可以注释 getter 方法。

于 2013-07-22T15:24:44.320 回答