带有 i18n 消息的 Spring-MVC + RESTeasy 表单 bean 验证 (JSR 303)

Posted

技术标签:

【中文标题】带有 i18n 消息的 Spring-MVC + RESTeasy 表单 bean 验证 (JSR 303)【英文标题】:Spring-MVC + RESTeasy form bean validation (JSR 303) with i18n messages 【发布时间】:2015-07-30 03:04:01 【问题描述】:

我有一个使用休眠表单 bean 验证的经典 spring-mvc Web 应用程序,它使用 i18n 捆绑文件在 JSP 中返回错误消息。 (Spring-MVC 4.0.7,Hibernate-validator 5.1.3)。下面对应的Spring配置部分:

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

这很好用;我的表单 bean 包含 @Length @NotNull @NotEmpty、@Pattern 等注释,并且 JSP 返回的表单包含 I18N 客户端语言中的约束违规消息。 例如,在 formBean 中:

public class MyFormBean 
    @NotEmpty @FormParam("name")
    private String name;    

    @FormParam("type")
    @Length(min=1, max=1) @NotNull
    private String type = "T";

    @NotNull @Pattern(regexp="^[1-9][0-9]*$")
    @FormParam("goal")
    private String goal;
  

我的 i18n ResourceBundle 属性文件中的消息键是这样的:

NotEmpty.myPostFormName.name = the name must be filled  
Pattern.myPostFormName.goal = the goal must be numeric positive. 

此后,使用本教程:http://java.dzone.com/articles/resteasy-spring 我添加了一个 RESTeasy 控制器部分(参见 Spring MVC 集成(https://docs.jboss.org/resteasy/docs/1.0.2.GA/userguide/html/RESTEasy_Spring_Integration.html);(使用依赖项 jar:resteasy-spring 3.0.11.Final 和 resteasy-validator- provider-11)

但是当我执行@Post 时,我无法自定义(和 i18n)返回的消息。例如:

@POST
public Response create (@Context UriInfo uri, @Valid @Form MyFormBean pMyformB)    

我得到一个响应体,如:

<violationReport>
   <parameterViolations>
      <constraintType>PARAMETER</constraintType>
      <path>create.arg1.type</path>
      <message>cannot be null</message>
      <value/>
   </parameterViolations>
   <parameterViolations>
      <constraintType>PARAMETER</constraintType>
      <path>create.arg1.goal</path>
      <message>cannot be null </message>
      <value/>
   </parameterViolations>
 </violationReport>  

那我不能自定义“消息”部分。

那么我怎样才能对两者使用相同的 (i18n) messageResources 文件:spring-MVC 经典帖子 JSP 和 RESTeasy @POST 违规报告?

[编辑]第二个问题:是否有可能与 Bean Validation 进行完整的 RESTeasy / SPringMVC 集成? 我的意思是:按照网站的教程(上面的链接) 如果我在 POST html 请求中添加 @Valid:

  @POST
  @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
  @Produces(MediaType.TEXT_HTML)
 public ModelAndView saveContactForm(@Valid @Form Contact contact) throws URISyntaxException 
    service.save(contact);
    return viewAll();
   

验证错误之前被拦截,REsteasy返回响应(默认为xml),所以我不能使用SpringMVC ModelAndView返回JSP。

【问题讨论】:

【参考方案1】:

您可以尝试切换到ValidationMessages.properties 作为消息源。这是 Bean Validation 的默认设置,也是 RESTeasy 使用的。要为 Spring MVC 切换到 ValidationMessages.properties,调整 `messageSource§ bean 的 basename 属性就足够了。

【讨论】:

感谢@Hardy 的回答。如果我通过这一行更改我的 Spring 配置,则有效: 它有效(即使我找不到任何方法来自定义此路径/名称或自定义违规报告(“路径”元素)。第二个问题是使用默认区域设置,我无法拦截客户端选择的区域设置。我还添加在我的帖子中关于 \@Valid 和 springMVC-RESTeasy 完全集成的另一个问题

以上是关于带有 i18n 消息的 Spring-MVC + RESTeasy 表单 bean 验证 (JSR 303)的主要内容,如果未能解决你的问题,请参考以下文章

Java Spring国际化(i18n)问题

Ruby on Rails i18n - 想要在模型中翻译自定义消息

JBoss 上带有 SockJS 的 Spring-MVC Websocket:如果没有 IO 事件,无法从 HTTP/1.1 升级

玩I18N库

ExtJS - 带有 i18n 文本的多语言

JSF2 i18n bean 验证消息