我在網上搜索了很多這個問題,但令人驚訝的是我找不到任何類似的帖子。 這裏是我的代碼: 這是延伸AbstractMessageSource<spring:message>標籤不能與數據庫資源包一起工作
public abstract class DatabaseMessageSourceBase extends AbstractMessageSource {
private Messages messages;
@Override
protected MessageFormat resolveCode(String code, Locale locale) {
String msg = messages.getMessage(code, locale);
return createMessageFormat(msg, locale);
}
@PostConstruct
public void init() {
this.messages = extractI18NData();
}
abstract protected Messages extractI18NData();
/**
*
* Messages bundle
*/
protected static final class Messages {
/* <code, <locale, message>> */
private Map<String, Map<Locale, String>> messages;
public void addMessage(String code, Locale locale, String msg) {
if (messages == null)
messages = new HashMap<String, Map<Locale, String>>();
Map<Locale, String> data = messages.get(code);
if (data == null) {
data = new HashMap<Locale, String>();
messages.put(code, data);
}
data.put(locale, msg);
}
public String getMessage(String code, Locale locale) {
Map<Locale, String> data = messages.get(code);
return data != null ? data.get(locale) : null;
}
}
}
abstract class和這裏是實現:
@Service("messageSourceVertical")
公共類VerticalDatabaseMessageSource擴展DatabaseMessageSourceBase {
@Autowired
private LocalizationDao localizationDao;
@Override
protected Messages extractI18NData() {
List<T_I18N_VERTICAL> tI18NList = localizationDao.getT_I18N_VERTICALData();
Messages messages = new Messages();
for(T_I18N_VERTICAL singleResult : tI18NList) {
messages.addMessage(singleResult.getCode(), new Locale(singleResult.getLocale()), singleResult.getMsg());
}
return messages;
}
}
一個簡單的控制器:
@Controller
公共類的LoginController {
@Autowired
private MessageSource messageSourceVertical;
@RequestMapping(value = "/login", method = RequestMethod.GET)
public ModelAndView login(
@RequestParam(value = "error", required = false) String error,
@RequestParam(value = "logout", required = false) String logout,
HttpServletRequest request, HttpServletResponse response) {
ModelAndView model = new ModelAndView();
if (error != null) {
model.addObject("error", "Invalid username and password!");
}
if (logout != null) {
model.addObject("msg", "You've been logged out successfully.");
}
// this works.
// model.addObject("msg", messageSourceVertical.getMessage("app.startup.successful", null, new Locale("en")));
model.setViewName("login");
return model;
}
}
我的HTML:
<spring:message code="app.startup.successful" />
應用成功[R當我使用@Autowired messageSourceVertical服務時,檢測控制器中的消息。但是,當我使用spring:message時它失敗了。 (它會拋出一個異常,說「在代碼'app.startup.successful'下找不到消息...」)。
任何人都可以請幫忙嗎?謝謝。
可能你有另一個優先的MessageSource bean?嘗試將@Order(Ordered.HIGHEST_PRECEDENCE)註釋添加到您的VerticalDatabaseMessageSource bean – Alexander 2014-10-18 11:12:30
Hi Alexander。我按照你的說法嘗試過,但不幸的是結果仍然是一樣的。 – Saro 2014-10-18 15:30:12
我覺得應用程序嘗試在屬性文件中查找消息,而不是在通過標記訪問它時調用自定義類。 –
Saro
2014-10-18 17:28:48