2014-10-18 32 views
0

我在網上搜索了很多這個問題,但令人驚訝的是我找不到任何類似的帖子。 這裏是我的代碼: 這是延伸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'下找不到消息...」)。

任何人都可以請幫忙嗎?謝謝。

+0

可能你有另一個優先的MessageSource bean?嘗試將@Order(Ordered.HIGHEST_PRECEDENCE)註釋添加到您的VerticalDatabaseMessageSource bean – Alexander 2014-10-18 11:12:30

+0

Hi Alexander。我按照你的說法嘗試過,但不幸的是結果仍然是一樣的。 – Saro 2014-10-18 15:30:12

+0

我覺得應用程序嘗試在屬性文件中查找消息,而不是在通過標記訪問它時調用自定義類。 – Saro 2014-10-18 17:28:48

回答

1

我發現問題出在哪裏。

在JSP中使用spring:message標記時,應用程序查找一個名爲「messageSource」的bean,在我的例子中,我明確地命名了我的service:「messageSourceVertical」。

將@Service(「messageSourceVertical」)更改爲@Service(「messageSource」)解決了問題。

另請注意,使用Thymeleaf, 「protected String getMessageInternal(String code,Object [] args,Locale locale);」方法被調用,因此必須被覆蓋以獲得正確的消息。

相關問題