typeMismatch自定义消息从不显示

时间:2014-11-26 20:34:32

标签: spring validation

我正在开发一个Spring + Hibernate项目,我正在使用表单的验证,并且我在类路径上有ValidationMessages.properties文件,它按照我的预期工作,除了Date字段,对于Date字段,验证总是显示消息

  

无法将java.lang.String类型的属性值转换为必需值   输入属性fechaFinal的java.util.Date;嵌套异常是   org.springframework.core.convert.ConversionFailedException:失败   从类型java.lang.String转换为类型@javax.persistence.Column   @ javax.validation.constraints.NotNull java.util.Date for value';   嵌套异常是java.lang.IllegalArgumentException

我正在寻找改变这一点,我发现我必须使用typeMismatch,但它对我不起作用,无论我怎么尝试,这都是我的来源:

ValidationMessages.properties

typeMismatch = La fecha debe tener el formato DD/MM/AAAA
typeMismatch.java.util.Date = La fecha debe tener el formato DD/MM/AAAA
typeMismatch.ciclo.fechaInicial = La fecha debe tener el formato DD/MM/AAAA 
typeMismatch.ciclo.fechaFinal = La fecha debe tenerel formato DD/MM/AAAA
typeMismatch.Ciclos.fechaInicial = La fecha debe tener el formato DD/MM/AAAA 
typeMismatch.Ciclos.fechaFinal = La fecha debe tener el formato DD/MM/AAAA
typeMismatch.fechaInicial = La fecha debe tener el formato DD/MM/AAAA 
typeMismatch.fechaFinal = La fecha debe tener el formato DD/MM/AAAA

string.empty=Este campo es obligatorioo
string.invalid.size=Este campo debe tener una longitud de {min} a {max} caracteres

date.invalid=Fecha obligatoria en formato: DD/MM/AAAA

string.empty和string.invalid.size每次都能正常工作,typeMismatch永远不会工作..

实体代码Ciclos.java

@Entity
@Table(name="ciclos")  
public class Ciclos implements Serializable{

    //...

    @Column(name = "nombre")    
    @NotEmpty(message="{string.empty}")
    @Size(min=5, max=55, message="{string.invalid.size}")   
    private String nombre;      

    @Column(name = "fecha_inicial")     
    @NotNull    
    private Date fechaInicial;      

    @Column(name = "fecha_final")
    @NotNull(message="{date.invalid}")  
    private Date fechaFinal;

    //... 
}

控制器代码CiclosController.java

@Controller public class CiclosController {

    //...   
    @RequestMapping(value="/saveciclo.html")
    public ModelAndView saveCiclo(@Valid Ciclos ciclo, BindingResult bindingResult, ModelMap modelMap){         
        if(bindingResult.hasErrors()){
            modelMap.put(BindingResult.class.getName()+".ciclo",bindingResult);         
        }       
        return new ModelAndView("cicloEdit","ciclo",ciclo);
    }    
}

查看代码cicloEdit.jsp

<%@ include file="/WEB-INF/views/include.jsp" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>    
<html>
<head>
    <!-- header data --> 
</head>
<body>
    <!-- some things -->
    <form:form action="saveciclo.html" method="post" commandName="ciclo">
        <form:label path="nombre">Ciclo: </form:label> 
        <form:input path="nombre" placeholder="Nombre del ciclo"></form:input> 
        <form:errors path="nombre"/> <br /> 
        <form:label path="fechaInicial">Inicia en: </form:label>
        <form:input path="fechaInicial" placeholder="DD/MM/AAAA fecha de inicio de ciclo">            </form:input>
        <form:errors path="fechaInicial"/> <br />
        <form:label path="fechaFinal">Termina en: </form:label>
        <form:input path="fechaFinal" placeholder="DD/MM/AAAA fecha de fin de ciclo"></form:input>
        <form:errors path="fechaFinal"/> <br />
        <input type="submit" value="Guardar" />
    </form:form>
</body>

那么,我的代码错了吗?

更新10-26-2016以回答nowszy94发表的评论

要解决我的问题:

位于以下位置的文件消息:

src/main/resources/messages/messages.properties

及其内容(与此问题相关):

typeMismatch.fechaInicial = La fecha debe tener el formato DD/MM/AAAA 
typeMismatch.fechaFinal = La fecha debe tener el formato DD/MM/AAAA
fecha.empty = Debe indicar una fecha
fecha.anterior = La fecha debe ser anterior
fecha.invalid = Fecha obligatoria en formato: DD/MM/AAAA 

我记得,每条错误信息的顺序都很重要。

现在进行配置,在你的aplication context xml文件中配置这个bean:

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

1 个答案:

答案 0 :(得分:1)

最后我发现发生了什么。我的控制器中有一个活页夹来格式化Date值,搜索和读取我在验证发生时找到的很多站点,在调用绑定之前弹出,并且在绑定时发生转换错误,因此它永远不会将消息用于验证

解决方案,添加另一个消息文件并配置为默认消息源,因此其消息适用于绑定和验证,现在所有消息都可以正常工作。