【问题标题】:how to return a custom message in jsp using spring 3 mvc and hibernate validator(jsr303)如何使用spring 3 mvc和hibernate验证器(jsr303)在jsp中返回自定义消息
【发布时间】:2011-07-31 21:56:34
【问题描述】:

我有一个项目使用 spring 3 mvc 和 hibernate 验证器来验证表单对象。

我关注spring的document

在我的控制器中,我可以获得绑定结果,即bindingresult.hasErrors() == true。

我使用ReloadableResourceBundleMessageSource 进行错误消息绑定。
我的问题是: 是否可以在我的 jsp 网页中显示更灵活的错误消息?

例如,我想说“应用名称 UserEnteredAppName 无效。大小应介于 2 和 255 之间”。

在我的 message.property 中,我定义:

Size.appNameForm.itemName=the app name {What Should I do in this brace?} is not valid. The size should be between {1} and {2}

{1} 和 {2} 可以内插到“2”和“255”。但是如何在插值消息中获取 UserEnteredAppName?

下面是我的表单类和控制器类:

我的控制器类:

@RequestMapping(value="foo.htm")
public String handleAppNameFormSubmit(@Valid @ModelAttribute("appNameForm") AppNameForm form, BindingResult result){
}

我的表单类:

public class AppNameForm implements IForm{
    @NotEmpty
    @Size(min = 1, max = 255)
    private String itemName;
    ....
}

我找到了一些给我一些提示的链接:

例如:How do I dynamically resolve message parameters with Hibernate Validator?

但我使用的是spring mvc和spring controll,哪个jsr303实现要使用,我找不到使用自定义验证器的方法,扩展了hibernate的默认ValidatorImpl。

我认为解决方案是,我可以有自定义验证器,它将拒绝 UserEnteredAppName 进入 bindingResult。可能吗?还是我应该找到其他方法?

谢谢 安德鲁

【问题讨论】:

  • 仅供参考,在我的jsp中,我使用spring标签绑定错误消息:<form:error path="itemName"/>

标签: jakarta-ee spring-mvc hibernate-validator


【解决方案1】:

从 4.2 版开始,Hibernate Validator 提供了ValueFormatterMessageInterpolator,这是一个新的消息插值器,应该可以满足您的要求。

使用该插值器,您可以使用占位符 ${validatedValue} 引用验证值。您还可以像这样指定要应用的format string:${validatedValue:[format string]},例如${validatedValue:%1$ty} 如果验证值为日期。

可以在 Hibernate Validator reference guide 中找到使用此插值器的示例。

【讨论】:

  • 我正在使用 Spring 3 MVC。因此错误消息由 ReloadableResourceBundleMessageSource(spring class) 处理。我可以使用休眠验证器的消息插值器吗?
  • 您应该能够将 ValueFormatterMessageInterpolator 与 Spring 的 MessageSourceResourceBundleLocator 结合使用,方法是在 Spring 的 LocalValidatorFactoryBean 处设置以下插值器:new ValueFormatterMessageInterpolator(new ResourceBundleMessageInterpolator(new MessageSourceResourceBundleLocator(yourReloadableMessageSource)))
  • 附加:鉴于您正在使用可重新加载的消息源,您可能应该使用构造函数ResourceBundleMessageInterpolator(ResourceBundleLocator userResourceBundleLocator, boolean cacheMessages),它允许在 Hibernate Validator 中禁用已解析消息的内部缓存。
猜你喜欢
  • 2019-04-21
  • 2011-05-01
  • 2012-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-10
  • 2011-07-08
相关资源
最近更新 更多