我有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
。有没有办法正确地做到这一点?
答案 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;
}
}
}
但我认为另一个更清洁。