我想把Bean Validation(JSR 303)使用的验证消息放在:。
javax.validation.constraints.AssertFalse.message=must be false
javax.validation.constraints.AssertTrue.message=must be true ...
到数据库中,这样当管理员添加新语言时,他就可以添加该语言的翻译。
我知道如何访问从数据库映射的资源包,但我无法弄清楚如何扩展/自定义bean验证类,以便他们可以从数据库访问验证消息......
是否有可能获得我想要的东西?
非常感谢你让我走向正确的方向。
这里的解决方案(我不知道这是否是最好的解决方案,但它有效......):
正如@gastaldi所建议的,我在MessageInterpolator接口上创建了一个实现:
package giates.validation;
import com.infomaxgroup.adaecommerce.bundles.DatabaseResourceBundle;
import java.util.Locale;
import java.util.Map;
import javax.validation.MessageInterpolator;
public class LocaleMessageInterpolator implements MessageInterpolator {
protected final String BRACE_OPEN = "\\{";
protected final String BRACE_CLOSE = "\\}";
@Override
public String interpolate(String message, Context context) {
return interpolate(message, context, Locale.ITALIAN);
}
@Override
public String interpolate(String message, Context context, Locale locale) {
DatabaseResourceBundle bundle = new DatabaseResourceBundle(locale);
String messageKey = context.getConstraintDescriptor().getAttributes().get("message").toString();
message = bundle.getString(messageKey.replaceAll(BRACE_OPEN, "").replaceAll(BRACE_CLOSE, ""));
Map<String, Object> attributes = context.getConstraintDescriptor().getAttributes();
for (String key : attributes.keySet()) {
String value = attributes.get(key).toString();
key = BRACE_OPEN + key + BRACE_CLOSE;
message = message.replaceAll(key, value);
}
return message;
}
}
然后我创建了META-INF / validation.xml并添加了自定义的messageinterpolator:
<?xml version="1.0" encoding="UTF-8"?>
<validation-config
xmlns="http://jboss.org/xml/ns/javax/validation/configuration"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/configuration">
<message-interpolator>giates.validation.LocaleMessageInterpolator</message-interpolator>
</validation-config>
当我发布验证失败的模型时,插值器会调用DatabaseResourceBundle并创建生成的消息......
一切都很棒!
答案 0 :(得分:1)
您需要为此创建一个自定义MessageInterpolator并在validator.xml中配置