带有 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 配置,则有效:以上是关于带有 i18n 消息的 Spring-MVC + RESTeasy 表单 bean 验证 (JSR 303)的主要内容,如果未能解决你的问题,请参考以下文章
Ruby on Rails i18n - 想要在模型中翻译自定义消息
JBoss 上带有 SockJS 的 Spring-MVC Websocket:如果没有 IO 事件,无法从 HTTP/1.1 升级