来自Apache Struts,我正在寻找一种方法来指定在使用spring:message标签时从哪个bundle获取消息:
WebConfig.java(messageSources定义)
@Bean
public ResourceBundleMessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
String[] baseNames = {
"resources.messages.layout.LayoutResources",
"resources.messages.layout.MenuResources",
"resources.messages.option.AppConfigResources",
"resources.messages.global.GlobalResources",
"resources.messages.contact.ContactResources",
"resources.messages.currentsession.CurrentSessionResources",
"resources.messages.welcome.WelcomeResources",
"resources.messages.user.UserResources",
"resources.messages.role.RoleResources",
"resources.messages.profile.ProfileResources"
};
messageSource.setUseCodeAsDefaultMessage(true);
messageSource.setDefaultEncoding(StandardCharsets.UTF_8.name());
messageSource.setBasenames(baseNames);
return messageSource;
}
我在Struts中的习惯
<bean:message bundle="userResources" key="label.firstName" />
我现在在Spring使用的内容
<spring:message code="label.firstName" />
这样可行,但如果出于任何原因在一个巨大的应用程序中,密钥被复制,Spring将默默地从基本名称定义中选择第一个。
要重现我在Struts中所拥有的内容,我执行了以下操作:
自定义JSP标记
<!DOCTYPE html>
<%@ tag pageEncoding="UTF-8" %>
<%@ attribute name="bundle" required="false" type="java.lang.String" rtexprvalue="false" %>
<%@ attribute name="key" required="true" type="java.lang.String" rtexprvalue="true" %>
<%@ attribute name="locale" required="false" type="java.lang.String" rtexprvalue="false" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:choose>
<c:when test="${empty bundle}">
<c:set var="bundleToUse" value="resources.messages.global.GlobalResources" />
</c:when>
<c:otherwise>
<c:set var="bundleToUse" value="resources.messages.${bundle}" />
</c:otherwise>
</c:choose>
<c:choose>
<c:when test="${empty locale}">
<c:set var="localeToUse" value="${pageContext.request.locale.language}" />
</c:when>
<c:otherwise>
<c:set var="localeToUse" value="${locale}" />
</c:otherwise>
</c:choose>
<fmt:setBundle var="bundleObjectToUse" basename="${bundleToUse}" />
<fmt:setLocale value="${localeToUse}" />
<fmt:message key="${key}" bundle="${bundleObjectToUse}" />
典型用法
使用特定的捆绑和区域设置
<t:message bundle="user.UserResources" key="error.userSearch.required" locale="fr">
使用特定的捆绑和默认区域设置
<t:message bundle="option.AppConfigResources" key="label.smtpServerHostname.note">
仅使用密钥,回退到GlobalResources
<t:message key="filterSearch">
我真的想要建立更接近Spring的东西。
谢谢