【问题标题】:Spring validation didn't display error messages saved in property file (freemarker template)Spring 验证未显示保存在属性文件(freemarker 模板)中的错误消息
【发布时间】:2015-11-24 03:49:47
【问题描述】:

.properties 文件中定义的显示错误消息有问题。

这是我的 servlet-context.xml 片段(它应该定义资源包并将其注入验证器;资源消息在其他任何地方都运行良好):

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

  <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
    <property name="defaultLocale" value="pl"/>
  </bean>

  <bean name="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
    <property name="validationMessageSource" ref="messageSource" />
  </bean>

这是我的属性文件的片段:

messages.forms.validation.size.between=bla bla bla
messages.forms.validation.size.between.and=and

这是一个字段定义。

@NotEmpty
@NotNull
@Size(min = 4, max = 25, message = "{messages.forms.validation.size.between} {min} {messages.forms.validation.size.between.and} {max}")
private String login;
public void setLogin(String v) { login = v; }
public String getLogin() { return login; }

我期望的是(根据:messages.forms.validation.size.between} {min} {messages.forms.validation.size.between.and} {max}")得到一个错误: bla bla bla 4 and 25,但我得到的是:

我花了几个小时试图找到一个没有成功的解决方案,所以请帮忙!

【问题讨论】:

  • 我知道你在做什么,但我能问你为什么不只是简单地做 message = "Size must be between 4 and 25" 吗?不是批评只是对您为什么使用这种方式感兴趣?
  • 在一个属性文件中包含所有字符串将为将来制作多语言应用程序提供一种简单的方法。
  • 是的,但是为什么在 bean 中设置这样的消息,为什么不直接在属性文件中设置呢?在我的 bean 中,我只有 @Size 之类的注释,然后在属性文件中 Size.userBean.username = Username 必须至少为 6 个字符,最多为 16 个字符。并且消息在验证后显示在jsp上
  • 看起来不错的解决方案,你能展示一个示例代码吗?我使用的是freemarker而不是jsp,我希望没关系。

标签: spring validation spring-mvc javabeans freemarker


【解决方案1】:

只需在属性文件中写入您的消息,无需在 Bean 中设置消息。下面是我如何通过属性文件显示验证错误消息。

servlet.xml:

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

UserBean.java:

@NotBlank
@Size(min = 6, max = 16)
@Pattern(regexp = "^\\w{6,}$")
@Id
private String username;

messages.properties:

Size.userBean.username = Username must be between 6 and 16 characters in length

register.jsp:

<li>
    <label id="outputUsername">
    <c:out value="Enter username:"></c:out>
    </label>
    <sf:input class="usernameInput" name="username" type="text"
      path="username" tabindex="0" id="usernameInput" />
    <sf:errors path="username" cssStyle="color:red;
      font-size: small;" />
</li>

【讨论】:

  • 不,这不起作用。在您的属性文件中,您有 Size.userBean.username - 我的 freemarker 模板中没有像 userBean 这样的东西。我会稍微改变一下我的问题的标题。不管怎样,谢谢 ! :)
  • @Mariusz.v7 userBean 只是我的 Bean Java 类的名称,它包含我所有的 getter/setter/properties,而 username 是属性的名称。就像您目前拥有的私人字符串登录一样;
  • 顺便说一句,是否可以将消息更改为以下内容: Size.userBean.username = 用户名必须最少 {min} 个字符,最多 {max} 个字符? (其中 {min} 和 {max} 在注释中声明)
  • 我刚刚进行了一系列快速尝试。更改为: Size.userBean.username = 用户名必须最少为 {2} 个字符,最多为 {1} 个字符。自己试试吧:)
猜你喜欢
  • 2017-01-15
  • 2011-11-25
  • 1970-01-01
  • 2011-04-21
  • 2012-03-03
  • 2022-01-09
  • 1970-01-01
  • 2012-07-23
  • 2015-12-24
相关资源
最近更新 更多