来自Struts / XWorks我能够做到这样的事情
Messages.properties
constexpr
申请代码
myMessage.invalid.fieldvalue=Invalid input for $'{'getText("{0}")'}'
email.label=Email Address
所以基本上我传递给消息的参数实际上是另一条消息的代码,我想将它们一起渲染。
我似乎无法通过Grails / Spring消息传递找到一种方法。这是可能的,如果是这样的话?
修改的: 为了更清楚地说明我要求这样做的原因之一就是这个例子。
假设我有5个具有属性getText("myMessage.invalid.fieldvalue",new String[] {"email.label"})
Output: Invalid input for Email Address
要验证NULL,我必须这样做
emailAddress
我希望能够做的只是通过覆盖默认验证消息来实现消息传递
myClass1.emailAddress.nullable=Email Address cannot be NULL
myClass2.emailAddress.nullable=Email Address cannot be NULL
myClass3.emailAddress.nullable=Email Address cannot be NULL
myClass4.emailAddress.nullable=Email Address cannot be NULL
myClass5.emailAddress.nullable=Email Address cannot be NULL
所以现在任何时候任何类都有一个名为OLD: default.null.message=Property [{0}] of class [{1}] cannot be null
NEW: default.null.message=getMessage({0}) cannot be null
emailAddress=Email Address
的属性并且它验证为NULL我将收到消息emailAddress
。没有必要有5条消息基本上说同样的事情。如果我有另一个具有属性Email Address cannot be null
的类,那么它已经处理完了,我不必复制并粘贴第6行。
任何时候我都有包含共享属性名称的类,我所要做的就是为每个将应用于所有类的属性添加一行
emailAddress
答案 0 :(得分:2)
在控制器中,为要进行国际化的参数调用message
并将其存储在本地变量中。
然后调用message
获取完整的消息,并将带有国际化参数值的本地变量添加为该消息的参数。
def emailLabel = message(code: "email.label")
def fullMessage = message(code: 'myMessage.invalid.fieldvalue', args: [emailLabel])
您的messages.properties将包含类似
的内容myMessage.invalid.fieldvalue=Invalid input for {0}
email.label=Email Address
答案 1 :(得分:2)
我可以通过扩展MessageSource
并覆盖resolveArguments
方法来完成此操作。
class CustomMessageSource extends ReloadableResourceBundleMessageSource {
@Override
protected Object[] resolveArguments(Object[] args, Locale locale) {
if (args == null) {
return new Object[0];
}
List<Object> resolvedArgs = new ArrayList<Object>(args.length);
for (Object arg : args) {
if (arg instanceof MessageSourceResolvable) {
resolvedArgs.add(getMessage((MessageSourceResolvable) arg, locale));
}
else {
//resolvedArgs.add(arg) **REPLACED THIS LINE
resolvedArgs.add(getMessage(arg, null, arg, locale));
}
}
return resolvedArgs.toArray(new Object[resolvedArgs.size()]);
}
}
我在循环中替换了一行来评估你的消息参数。我基本上接受了这个论点,看看它是否是另一个消息的关键。如果是,则用该消息替换参数,如果否,则继续正常使用参数
确保在resources.groovy
文件
beans = {
messageSource(groovyUtils.CustomMessageSource) {
basenames = "messages"
}
}