如何避免以编程方式为枚举获取bean?

时间:2015-01-11 13:02:11

标签: java spring

我有Enum

public enum EmployeeErrorCode {
    DELETE_SUCCESS,

    //... Other enumerators

    @Override
    public String toString(){
        ApplicationContext ctx = ContextLoader
                                         .getCurrentWebApplicationContext();
        MessageSource messageSource = (MessageSource) ctx
                                         .getBean("messageSource"); //How to avoid this?
        switch (this) {
        case DELETE_SUCCESS:
            return messageSource.getMessage("deleteEmployee.success", 
                                          null, LocaleContextHolder.getLocale());

        //... Other cases

        default:
            return null;
        }
    }
}

toString nethod中,我为任何Enumerator指定了消息,但我使用getBean方法以编程方式获取适当的bean。我怎么能避免这种情况?

我试图通过

注入bean
@Autowired
MessageSource messageSource;

但它不起作用。实际上,messageSource只是null。有没有办法正确地做到这一点?

1 个答案:

答案 0 :(得分:1)

如果MessageSource是一个打开properties文件的bean,那么例如,如果您的属性文件被调用Messages.properties,那么您可以使用

ResourceBundle bundle = ResourceBundle.getBundle("Messages", LocaleContextHolder.getLocale());
String message = bundle.getString("deleteEmployee.success");

编辑:另一种可能的方法是将MessageSource注入您的枚举(来自Java Generics and Enum, loss of template parameters的解决方案的想法),如下所示:

public enum EmployeeErrorCode {
    DELETE_SUCCESS {
        @Override
        public String toString() {
             return messageSource.getMessage("deleteEmployee.success", null, LocaleContextHolder.getLocale());
        }
    },
    //... Other enumerators

    private MessageSource messageSource;

    static class EnumInitializer {
        @Autowired
        private MessageSource messageSource;

        @PostConstruct
        public void init() {
            for(EmployeeErrorCode errorCode : EmployeeErrorCode.values() {
                errorCode.messageSource = getMessageSource();
            }
        }

        public MessageSource getMessageSource() {
            return messageSource;
        }
    }
}

但我认为另一个更清洁。