【问题标题】:Put validation messages into database将验证消息放入数据库
【发布时间】:2013-08-03 16:39:02
【问题描述】:

我想放置 Bean Validation (JSR 303) ex. 使用的验证消息:

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 并创建结果消息...

一切都很好!

【问题讨论】:

    标签: java customization bean-validation


    【解决方案1】:

    您需要为此创建一个自定义的 MessageInterpolator 并在您的 validator.xml 中进行配置

    【讨论】:

    • 也可能是 ResourceBundle 专业化
    • 非常感谢@gastaldi,你把我带向了正确的方向,我已经自定义了 messageinterpolator 并从数据库中读取了消息,我将解决方案放入了我的问题中......
    猜你喜欢
    • 2019-02-11
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    相关资源
    最近更新 更多