Не удалось отобразить сообщение об ошибке после неудачной проверки формы mvc. - PullRequest
2 голосов
/ 23 марта 2012

У меня есть класс в бизнес-модели:

public class User {
     @Size(min = 3, max = 20, message = "Username must be between 3 and 20 characters long")
     @Pattern(regexp = "^[a-zA-Z0-9]+$", message = "Username must be alphanumeric with no spaces")
     @Column(name = "name")
     private String name;

     @Id
     @GeneratedValue
     @Column(name = "user_id")
     private Long userID;

     @OneToMany(cascade = CascadeType.ALL)
     @JoinTable(name = "userDic", joinColumns = { @JoinColumn(name = "user_id", referencedColumnName = "user_id") }, inverseJoinColumns = {
 @JoinColumn(name = "acc_id", referencedColumnName = "acc_id") })
     @LazyCollection(value = LazyCollectionOption.FALSE)
     private Set<Account> allAccounts; //............. //constructors , setters , getters here

В jsp ввод нового пользователя происходит через форму пружины:

<form:form method="post" action="AddUser" modelAttribute="user">
        <table>
            <tr>
                <td><form:label path="name">First Name</form:label></td>
                <td><form:input path="name" /></td>
                <td><form:errors path="*" /></td>
            </tr>
            <tr>
                <td colspan="2"><input type="submit" value="Add User" /></td>
            </tr>
        </table>
    </form:form>

Вот контроллер, который обрабатывает этот jsp:

@Controller
@SessionAttributes
public class AdminServlet
{

    /* private UserValidator validator;

     @InitBinder("user")
     protected void initBinder(WebDataBinder binder)
     {
         binder.setValidator(validator);
     }*/

    @RequestMapping(value = "/")
    public ModelAndView showUsers() throws ClassNotFoundException, SQLException
    {
        ModelAndView mav = new ModelAndView();
        mav.setViewName("index");
        mav.addObject("ATMUsers", MainService.getAllUsers());
        mav.addObject("user", new User());
        return mav;
    }

    @RequestMapping(value = "/AddUser", method = RequestMethod.POST)
    public String AddUser(@ModelAttribute("user") @Valid User user, BindingResult result)
    {
        if (!result.hasErrors())
            MainService.AddUser(user);
        return "redirect:/";
    }

}

Проверка правильности для поля name.Но контроллер просто перезагрузил страницу, и я не вижу никаких сообщений об ошибках.

Если я раскомментирую код в контроллере относительно UserValidator и InitBinder, я получу ошибку, но это не текст в <form:errors path="*" />, а исключение java

javax.validation.ConstraintViolationException: проверка не удалась для классов [com.antonbanking.business.User] в течение продолжительного времени для групп [javax.validation.groups.Default,]

Вопрос в том, что я сделал неправильно, чтобы просто получить проверкусообщение об ошибке ?КСТАТИ полный код доступен в GitHub .

Ответы [ 2 ]

4 голосов
/ 28 марта 2012

Я решаю проблему самостоятельно - проблема была взамен AdminServlet.AddUser.потому что я сделал "redirect:/", это привело к созданию совершенно новых объектов, включая BindingResult, поэтому вся информация об ошибке была стерта.
После изменения

    @RequestMapping(value = "/AddUser", method = RequestMethod.POST)
    public String AddUser(@ModelAttribute("user") @Valid User user, BindingResult result)
    {
        if (!result.hasErrors())
            MainService.AddUser(user);
        return "redirect:/";
    }

на

    @RequestMapping(value = "/AddUser", method = RequestMethod.POST)
    public ModelAndView AddUser(@ModelAttribute("user") @Valid User user, BindingResult result)
    {
        ModelAndView mav = new ModelAndView();
        mav.setViewName("index");
        mav.addObject("ATMUsers", MainService.getAllUsers());
        if (result.hasErrors())
            mav.addObject("user", user);
        else
        {
            mav.addObject("user", new User());
            MainService.AddUser(user);
        }
        return mav;
    }

Все начинает работатьправильно.

0 голосов
/ 26 марта 2012

Исключение Catch около MainService.AddUser(user); и в предложении catch добавить ошибки в объект BindingResult или перенаправить.

См. BindingResult (addError или reject * from Errors) См. Также Проверка (без аннотации)

...