Spring MVC <form:errors>没有显示错误

时间:2015-10-09 16:07:08

标签: java spring forms hibernate validation

我正在创建一个Spring MVC(4.2.1)/ Hibernate(5.0.1)Web应用程序。我正在尝试在表单中进行错误验证。

验证本身正在运行。当我在控制器中调用result.getAllErrors()时。我得到以下输出:

[Field error in object 'user' on field 'first_name': rejected value [a];
    codes [Size.user.first_name,Size.first_name,Size]; 
    arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.first_name,first_name]; 
    arguments []; 
    default message [first_name],4,2]; 
    default message [size must be between 2 and 4]
] 

我的.jsp文件中的<form:errors />不能正常工作。它根本不输出任何东西。

有人知道如何解决这个问题吗?

create.jsp(查看)

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="tg" tagdir="/WEB-INF/tags" %>

<div class="container-fluid">
    <ol class="breadcrumb">
        <li><a href="/host/manage/dashboard/index"><spring:message code="dashboard.title" /></a></li>
        <li><a href="/host/manage/users/index"><spring:message code="user.title" /></a></li>
        <li class="active"><spring:message code="user.create_entity" /></li>
    </ol>
    <form:form method="post" modelAttribute="user" autocomplete="off">
            <div class="panel panel-default">
                <div class="panel-heading">
                    <strong><spring:message code="user.title" /></strong>
                    <p><spring:message code="user.create_entity" /></p>
                </div>
                <div class="panel-body">
                    <div class="row">
                        <div class="col-md-6">
                            <div class="form-group">
                                <label for="firstName"><spring:message code="user.first_name" /></label>
                                <spring:message code="user.first_name_placeholder" var="user_first_name_placeholder"/>
                                <form:input type="text" path="firstName" class="form-control" id="firstName" placeholder="${user_first_name_placeholder}" autocomplete="off" />
                                <form:errors path="firstName" />
                            </div>
                        </div>
                        <div class="col-md-6">
                            <div class="form-group">
                                <label for="lastName"><spring:message code="user.last_name" /></label>
                                <spring:message code="user.last_name_placeholder" var="user_last_name_placeholder"/>
                                <form:input type="text" path="lastName" class="form-control" id="lastName" placeholder="${user_last_name_placeholder}" autocomplete="off" />
                            </div>
                        </div>
                    </div>
                    <div class="row">
                        <div class="col-md-12">
                            <div class="form-group">
                                <label for="email"><spring:message code="user.email" /></label>
                                <spring:message code="user.email_placeholder" var="user_email_placeholder"/>
                                <form:input type="email" path="email" class="form-control" id="email" placeholder="${user_email_placeholder}" autocomplete="off" />
                            </div>
                        </div>
                    </div>
                    <div class="row">
                        <div class="col-md-6">
                            <div class="form-group">
                                <label for="password"><spring:message code="user.password" /></label>
                                <spring:message code="user.password_placeholder" var="user_password_placeholder"/>
                                <form:input type="password" path="password" class="form-control" id="password" placeholder="${user_password_placeholder}" autocomplete="off" />
                            </div>
                        </div>
                        <div class="col-md-6">
                            <div class="form-group">
                                <label for="passwordConfirmation"><spring:message code="user.password_confirmation" /></label>
                                <spring:message code="user.password_confirmation_placeholder" var="user_password_confirmation_placeholder"/>
                                <form:input type="password" path="passwordConfirmation" class="form-control" id="passwordConfirmation" placeholder="${user_password_confirmation_placeholder}" autocomplete="off" />
                            </div>
                        </div>
                    </div>
                    <div class="row">
                        <div class="col-md-12">
                            <div class="form-group">
                                <label for="role"><spring:message code="user.role" /></label>
                                <form:select path="role" id="role" class="form-control" required="required">
                                    <option default>-- <spring:message code="general.click_to_select" /> --</option>
                                    <c:forEach items="${roles}" var="role">
                                        <c:set value="user.${role }" var="roleMessage"  />
                                        <option value="${role }"><spring:message code="${roleMessage }"/></option>
                                    </c:forEach>
                                </form:select>
                            </div>
                        </div>
                    </div>
                    <div class="row">
                        <div class="col-md-12">
                            <div class="form-group">
                                <label for="enabled"><spring:message code="user.enabled" /></label>
                                <form:select path="enabled" id="enabled" class="form-control" required="required">
                                    <option default>-- <spring:message code="general.click_to_select" /> --</option>
                                    <option value="1"><spring:message code="user.enabled_1" /></option>
                                    <option value="0"><spring:message code="user.enabled_0" /></option>
                                </form:select>
                            </div>
                        </div>
                    </div>
                </div>
                <div class="panel-footer">
                    <form:button type="submit" class="btn btn-sm btn-success"><spring:message code="general.save" /></form:button>
                </div>
            </div>
    </form:form>
</div>

UserController.java(控制器)

package com.klm.workshop.controller.host.manage;

import com.klm.workshop.dao.UserDAO;
import com.klm.workshop.model.User;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.support.PagedListHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

/**
 * Host manage users controller
 * 
 * @author -
 */
@Controller("hostManageUserController")
@RequestMapping(value="/host/manage")
public class UserController {

    /**
     * User data access object
     */
    @Autowired
    private UserDAO userDAO;

    /**
     * List of users
     * 
     * @param model Objects and view
     * @param page Current pagination page
     * @param search Search value
     * @return The users list view
     */
    @RequestMapping(value="/users/index", method=RequestMethod.GET)
    public ModelAndView index(
            ModelAndView model, 
            @RequestParam(name="p", required=false, defaultValue = "0") int page, 
            @RequestParam(name="search", required=false, defaultValue = "") String search
    ) {
        PagedListHolder pagedListHolder = new PagedListHolder();
        pagedListHolder.setSource(userDAO.searchAll(search));
        pagedListHolder.setPage(page);


        model.addObject("pagedListHolder", pagedListHolder);
        model.setViewName("host/manage/users/index");
        return model;
    }

    /**
     * Show create user form
     * 
     * @param model Objects and view
     * @return Form to create a user
     */
    @RequestMapping(value="/users/create", method=RequestMethod.GET)
    public ModelAndView getCreate(ModelAndView model) {
        model.addObject("user", new User());
        model.addObject("roles", User.Role.values());
        model.setViewName("host/manage/users/create");
        return model;
    }

    /**
     * Create user, and show create user form
     * 
     * @param model Objects and view
     * @param user The posted user
     * @param result Binded validation
     * @return Form to create a user, or a redirect (if user was created successfully)
     */
    @RequestMapping(value="/users/create", method=RequestMethod.POST)
    public ModelAndView postCreate(
            ModelAndView model, 
            @ModelAttribute("user") @Valid User user, 
            BindingResult result
    ) {
        if (result.hasErrors()) {
            model.addObject("user", user);
            model.addObject("roles", User.Role.values());
            model.setViewName("host/manage/users/create");
        } else {
            model.setViewName("redirect:/host/manage/users/create");
        }

        return model;
    }

}

User.java(型号)

package com.klm.workshop.model;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.Email;

/**
 * User model
 * 
 * @author -
 */
@Entity
@Table(name="users")
public class User implements Serializable {

    /**
     * Host role (enum value for the user role)
     */
    public static final String ROLE_HOST = "ROLE_HOST";

    /**
     * Participant role (enum value for the user role)
     */
    public static final String ROLE_PARTICIPANT = "ROLE_PARTICIPANT";

    /**
     * Administrator role (enum value for the user role)
     */
    public static final String ROLE_ADMINISTRATOR = "ROLE_ADMINISTRATOR";

    /**
     * Host action
     */
    public static final String ACTION_HOST = "host";

    /**
     * Participate action
     */
    public static final String ACTION_PARTICIPATE = "participate";

    /**
     * Identifier for user
     */
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="id")
    private int id;

    /**
     * Email from the user
     */
    @Email
    @NotNull
    @Column(name="email")
    private String email;

    /**
     * Hashed password from the user
     */
    @NotNull
    @Column(name="password")
    private String password;

    /**
     * Hashed password confirmation from the user
     */
    @Transient
    private String password_confirmation;

    /**
     * Role from the user
     */
    @Enumerated(EnumType.STRING)
    @NotNull
    @Column(name="role")
    private Role role;

    /**
     * If user is blocked
     */
    @NotNull
    @Column(name="enabled")
    private boolean enabled;

    /**
     * User's first name
     */
    @NotNull
    @Size(min = 2, max = 4)
    @Column(name="first_name")
    private String first_name;

    /**
     * User's last name (also containing optional insertion)
     */
    @NotNull
    @Size(min = 2, max = 255)
    @Column(name="last_name")
    private String last_name;

    /**
     * User's action (want does the user want to do, participate or host)
     */
    @Transient
    private String action;

    /**
     * User's workshop (only set if the user is a participant)
     */
    @Transient
    private Workshop workshop;

    /**
     * Enum values for the role column
     */
    public enum Role {
        ROLE_PARTICIPANT, 
        ROLE_HOST, 
        ROLE_ADMINISTRATOR;
    }

    /**
     * @return the id
     */
    public int getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(int id) {
        this.id = id;
    }

    /**
     * @return the email
     */
    public String getEmail() {
        return email;
    }

    /**
     * @param email the email to set
     */
    public void setEmail(String email) {
        this.email = email;
    }

    /**
     * @return the hashed password
     */
    public String getPassword() {
        return password;
    }

    /**
     * @param password the password to set
     */
    public void setPassword(String password) {
        BCryptPasswordEncoder bcrypt = new BCryptPasswordEncoder();
        String hashedPassword = bcrypt.encode(password);
        this.password = hashedPassword;
    }

    /**
     * @return the hashed password
     */
    public String getPasswordConfirmation() {
        return password_confirmation;
    }

    /**
     * @param password_confirmation the password confirmation to set
     */
    public void setPasswordConfirmation(String password_confirmation) {
        BCryptPasswordEncoder bcrypt = new BCryptPasswordEncoder();
        String hashedPassword = bcrypt.encode(password_confirmation);
        this.password_confirmation = hashedPassword;
    }

    /**
     * @return the role
     */
    public Role getRole() {
        return role;
    }

    /**
     * @param role the role to set
     */
    public void setRole(Role role) {
        this.role = role;
    }

    /**
     * @return the enabled status
     */
    public boolean getEnabled() {
        return enabled;
    }

    /**
     * @param enabled the enabled status to set
     */
    public void setEnabled(boolean enabled) {
        this.enabled = enabled;
    }

    /**
     * @return the first_name
     */
    public String getFirstName() {
        return first_name;
    }

    /**
     * @param first_name the first_name to set
     */
    public void setFirstName(String first_name) {
        this.first_name = first_name;
    }

    /**
     * @return the last_name
     */
    public String getLastName() {
        return last_name;
    }

    /**
     * @param last_name the last_name to set
     */
    public void setLastName(String last_name) {
        this.last_name = last_name;
    }

    /**
     * @return the first_name and last_name
     */
    public String getFullName() {
        return getFirstName() + " " + getLastName();
    }

    /**
     * @return the action
     */
    public String getAction() {
        return action;
    }

    /**
     * @param action the action to set
     */
    public void setAction(String action) {
        this.action = action;
    }

    /**
     * @return the workshop
     */
    public Workshop getWorkshop() {
        if(this.action.equals(ACTION_HOST)) {
            throw new UnsupportedOperationException("Workshop cannot be returned when user is hosting a workshop");
        }

        return workshop;
    }

    /**
     * @param workshop the workshop to set
     */
    public void setWorkshop(Workshop workshop) {
        if(this.action.equals(ACTION_HOST)) {
            throw new UnsupportedOperationException("Workshop cannot be set when user is hosting a workshop");
        }

        this.workshop = workshop;
    }

}

1 个答案:

答案 0 :(得分:1)

您正在执行重定向 model.setViewName( “重定向:/主机/管理/用户/创建”);

您的错误存储在模型中,随后存储在HttpServletRequest属性中。这些仅在一个请求的持续时间内持续。重定向导致客户端发送新请求。因此,在渲染重定向视图时,它们不存在。

考虑使用flash属性。

请看下面的例子

Spring - Redirect after POST (even with validation errors)