Spring启动配置MessageInterpolator @Bean

时间:2016-09-27 05:37:44

标签: spring hibernate validation spring-mvc

我在我的应用程序中使用Spring boot v1.4和hibernate v4.3.5.finall

我编写了自己的ResourceBundle和MessageInterpolator来保存数据库中的消息,并在项目中将它们配置为bean。似乎ResourceBundle工作正常并返回我的自定义消息,但参数不会通过,例如用于此验证:

@Size(min=5,max = 10)
private String lastName;

我希望:大小必须介于5到10之间......

但结果是:大小必须介于{min}和{max} bla bla .....

之间

任何想法?感谢..

我的ResourceBundle类:

package ir.pt.core.bundles;

import ir.pt.common.bean.ResourceEntity;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import java.io.IOException;
import java.util.*;

public class DatabaseResourceBundle extends ResourceBundle {

    @PersistenceContext
    protected EntityManager em;
    private Map<String, String> cache = new HashMap<String, String>();
    protected final static String BUNDLE_NAME = "ir.pt.core.bundles";
    protected Control DB_CONTROL = new DBControl();

    public DatabaseResourceBundle() {

        setParent(ResourceBundle.getBundle(BUNDLE_NAME, DB_CONTROL));
    }

    public DatabaseResourceBundle(Locale locale) {
        setParent(ResourceBundle.getBundle(BUNDLE_NAME, locale, DB_CONTROL));
    }

    @Override
    protected Object handleGetObject(String key) {
        return cache != null ? cache.get(key) : parent.getObject(key);
    }

    @Override
    public Enumeration<String> getKeys() {
        return parent.getKeys();
    }

    protected class DBControl extends Control {

        @Override
        public ResourceBundle newBundle(String baseName, Locale locale, String format, ClassLoader loader, boolean reload)
                throws IllegalAccessException, InstantiationException, IOException {
            return new CustomizedLocaleResources(locale);
        }

        protected class CustomizedLocaleResources extends ListResourceBundle {
            private Locale locale;
            public CustomizedLocaleResources(Locale locale) {
                this.locale = locale;
            }

            @Override
            protected Object[][] getContents() {
                String sql = "FROM ResourceEntity re WHERE re.locale = '"+locale.getLanguage()+"'";
                TypedQuery<ResourceEntity> query =
                em.createQuery(sql, ResourceEntity.class);
                List<ResourceEntity> resources = query.getResultList();
                Object[][] all = new Object[resources.size()][2];
                int i = 0;
                for (Iterator<ResourceEntity> it = resources.iterator(); it.hasNext();) {
                    ResourceEntity resource = it.next();
                    all[i] = new Object[]{resource.getKey(), resource.getMessage()};
                    cache.put(resource.getKey(), resource.getMessage());
                    i++;
                }
                return all;
            }

        }
    }
}

我的MessageInterpolator类:

package ir.pt.core.bundles;

import org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator;
import org.springframework.beans.factory.annotation.Autowired;

import javax.validation.MessageInterpolator;
import java.util.Locale;
import java.util.Map;


public class DatabaseMessageInterpolator extends ResourceBundleMessageInterpolator implements MessageInterpolator{
    protected final String BRACE_OPEN = "\\{";
    protected final String BRACE_CLOSE = "\\}";

    @Autowired
    DatabaseResourceBundle databaseResourceBundle;

    @Override
    public String interpolate(String message, Context context) {

        return interpolate(message, context, databaseResourceBundle.getLocale());
    }

    @Override
    public String interpolate(String message, Context context, Locale locale) {
        String messageKey = context.getConstraintDescriptor().getAttributes().get("message").toString();
        message = databaseResourceBundle.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;
    }
}

我的bean配置:

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurationSupport {

    @Override
    public Validator getValidator() {
        LocalValidatorFactoryBean factory = new LocalValidatorFactoryBean();
        factory.setMessageInterpolator(messageInterpolator());
        return factory;
    }

    @Bean
    public MessageInterpolator messageInterpolator() {
        return new DatabaseMessageInterpolator();
    }

    @Bean
    ResourceBundle resourceBundle() {
        return new DatabaseResourceBundle(new Locale("fa"));
    }
}

0 个答案:

没有答案