【问题标题】:I can't display error message using JSR303 @Valid我无法使用 JSR303 @Valid 显示错误消息
【发布时间】:2014-09-11 10:02:41
【问题描述】:

我尝试在我的 jsp 文件中显示错误消息,但它不起作用。

这是我的模型类,名为 EmployeeEntity.java

@Entity
@Table(name="EMPLOYEE")
public class EmployeeEntity 
{
    @Id
    @Column(name="ID")
    @GeneratedValue
    private Integer id;

    @Column(name="FIRSTNAME")
    private String firstname;

    @Column(name="LASTNAME")
    private String lastname;

    @NotEmpty
    @Column(name="ADDRESS")
    private String address;

    @Column(name="EMAIL")
    private String email;

    @Column(name="TELEPHONE")
    private String telephone;

    @Column(name="USERNAME")
    private String username;

    @Column(name="PASSWORD")
    private String password;


    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getTelephone() {
        return telephone;
    }

    public void setTelephone(String telephone) {
        this.telephone = telephone;
    }
}

这是我的jsp页面

<form:form method="post" commandName="employeeEntity" action="add">
<form:errors path="*" cssClass="errorblock" element="div" />
<div class="panel panel-primary">
    <div class="panel-heading">
        Employee Register Form
    </div>
    <div class="panel-body">
        <div class="form-group">
            <label class="col-lg-2 control-label">
                <fmt:message key="label.firstname" />
            </label>
            <div class="col-lg-10">
                <form:input path="firstname" class="form-control" placeholder="first name" />
                <span class="help-block"></span>
            </div>
        </div>
        <div class="form-group">
            <label class="col-lg-2 control-label">
                <fmt:message key="label.lastname"/>
            </label>
            <div class="col-lg-10">
                <form:input path="lastname" class="form-control" placeholder="last name" />
                <span class="help-block"></span>
            </div>
        </div>
        <div class="form-group">
            <label class="col-lg-2 control-label">
                <fmt:message key="label.address"/>
            </label>
            <div class="col-lg-10">
                <form:textarea rows="5" path="address" class="form-control" placeholder="address" />
                <form:errors path="address" cssClass="error" />
                <span class="help-block"></span>
            </div>
        </div>
        <div class="form-group">
            <label class="col-lg-2 control-label">
                <fmt:message key="label.gender"/>
            </label>
            <div class="col-lg-10">
                <label class="label-radio">
                    <form:radiobutton path="gender" value="male"/>
                    Male
                </label>
                <label class="label-checkbox">
                    <form:radiobutton path="gender" value="female" />
                    Female      
                </label>
                <span class="help-block"></span>
            </div>
        </div>
        <div class="form-group">
            <label class="col-lg-2 control-label">
                <fmt:message key="label.email"/>
            </label>
            <div class="col-lg-10">
                <form:input path="email" class="form-control" placeholder="email" />
                <span class="help-block"></span>
            </div>
        </div>
        <div class="form-group">
            <label class="col-lg-2 control-label">
                <fmt:message key="label.phonenumber"/>
            </label>
            <div class="col-lg-10">
                <form:input path="telephone" class="form-control" placeholder="phone number" />
                <span class="help-block"></span>
            </div>
        </div>
        <div class="form-group">
            <label class="col-lg-2 control-label">
                <fmt:message key="label.username"/>
            </label>
            <div class="col-lg-10">
                <form:input path="username" class="form-control" placeholder="username" />
                <span class="help-block"></span>
            </div>
        </div>
        <div class="form-group">
            <label class="col-lg-2 control-label">
                <fmt:message key="label.password"/>
            </label>
            <div class="col-lg-10">
                <form:password path="password" class="form-control" placeholder="password" />
                <span class="help-block"></span>
            </div>
        </div>
    </div>
    <div class="panel-footer">
        <input type="submit" class="btn btn-primary" value="<fmt:message key="button.submit" />" />
        <input type="reset" class="btn btn-warning" value="<fmt:message key="button.reset" />" />
    </div>
</div>

这是我的 xml 文件

<context:annotation-config />
<context:component-scan base-package="com.howtodoinjava.controller" />

<mvc:annotation-driven />
<mvc:resources mapping="/css/**" location="/css/" />
<mvc:resources mapping="/js/**" location="/js/" />


enter code here
<bean id="jspViewResolver"
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass"
        value="org.springframework.web.servlet.view.JstlView" />
    <property name="prefix" value="/WEB-INF/view/" />
    <property name="suffix" value=".jsp" />
</bean>

<bean id="messageSource"
    class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basename" value="messages" />
    <property name="defaultEncoding" value="UTF-8" />
</bean>

<bean id="propertyConfigurer"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
    p:location="/WEB-INF/jdbc.properties" />

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close" p:driverClassName="${jdbc.driverClassName}"
    p:url="${jdbc.databaseurl}" p:username="${jdbc.username}" p:password="${jdbc.password}" />

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation">
        <value>classpath:hibernate.cfg.xml</value>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">${jdbc.dialect}</prop>
            <prop key="hibernate.show_sql">true</prop>
        </props>
    </property>
</bean>

<bean id="employeeDAO" class="com.howtodoinjava.dao.EmployeeDaoImpl"></bean>
<bean id="carDAO" class="com.howtodoinjava.dao.CarDaoImpl"></bean>

<bean id="employeeManager" class="com.howtodoinjava.service.EmployeeManagerImpl"></bean>
<bean id="carManager" class="com.howtodoinjava.service.CarManagerImpl"></bean>

<tx:annotation-driven transaction-manager="transactionManager" />

<bean id="transactionManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

这是我的控制器类

    @RequestMapping(value = "registerForm/add", method = RequestMethod.POST)
public String addEmployee(@Valid EmployeeEntity employee, BindingResult result){
    if(result.hasErrors()) {
        return "redirect:/registerForm/form";
    } else {
        employeeManager.addEmployee(employee);
        return "redirect:/list";
    }
}

我希望你能帮助我,我是春季休眠的新手

谢谢, 最好的问候

【问题讨论】:

    标签: java spring hibernate annotations


    【解决方案1】:

    您需要有一个实现包含验证逻辑的org.springframework.validation.Validator 接口的验证器类(例如EmployeeValidator)。除此之外,您还需要在控制器类中绑定该验证器,您的 addEmployee 方法定义如下:

    假设您通过控制器类中的变量employeeValidator 声明了EmployeeValidator(您可以通过在bean config xml 中声明它来自动装配),那么您需要在控制器类中绑定验证器,如下所示。

    @InitBinder
    private void initBinder(WebDataBinder binder) {
        binder.setValidator(employeeValidator);
    }
    

    然后验证器会自动调用并在 BindingResult 中设置错误(即导致您的方法签名)。

    要编写验证器实现,请检查以下链接:

    Spring MVC Form Validation Example using Annotation and Custom Validator implementation

    Validation Framework in Spring with Example

    希望对你有帮助。

    【讨论】:

    • 如果我只是在“地址”属性中给出“非空”约束,它还需要验证器类吗?很抱歉,感谢您的回答。
    • 你有没有机会调试if(result.hasErrors()){..}这行代码,看看它是否返回true?
    • 是的。那 Else If 块工作正常。我的意思是当我在电子邮件字段中输入空值时,它会进入 IF 块,但是当我在地址字段中输入内容时,它将进入 ELSE 块。是你的意思吗? @Uresh 。感谢您之前的回答
    • 我猜,你的意思是,当 address 字段的值为空值时,它返回 true。无论如何,spring mvc 是否将您重定向到 /registerForm/form.jsp 页面?这里没有任何内容可以评估相关 .jsp 文件中发生的情况。
    【解决方案2】:

    问题解决了..

    我已经更新了我的问题并包含了我的 jsp 页面以及其中的问题。

    我无法显示我的错误消息,因为 &lt;form:form&gt; 标记中的 commandName 不应用我的模型类名称中的驼峰式。所以我从“employee”变成了“employeEntity”

    我从this link找到了答案

    希望这个问题对你们也有帮助...

    【讨论】:

      猜你喜欢
      • 2020-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-29
      • 2019-06-02
      • 2011-10-31
      • 1970-01-01
      • 2021-10-10
      相关资源
      最近更新 更多