java - < Spring :message> tag not working with resource bundles from database

标签 java spring jsp spring-mvc

我在网上搜索了很多这个问题,但令人惊讶的是我找不到任何类似的帖子。 这是我的代码: 这是扩展 AbstractMessageSource 的抽象类

    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;
    }
}

}

这是实现:

@Service("messageSourceVertical")

公共(public)类 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 :

@Controller

公共(public)类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" />

当我使用 @Autowired messageSourceVertical 服务时,应用程序成功检索 Controller 中的消息。但是当我使用 spring:message 时它不起作用。 (它抛出一个异常,显示“在代码‘app.startup.successful’下找不到消息......”)。

有人可以帮忙吗?谢谢。

最佳答案

我发现问题出在哪里了。

在 JSP 中使用 spring:message 标记时,应用程序会查找名为“messageSource”的 bean,在我的例子中,我已明确命名我的服务:“messageSourceVertical”。

将 @Service("messageSourceVertical") 更改为 @Service("messageSource") 解决了问题。

另请注意,使用 Thymeleaf, “ protected String getMessageInternal(字符串代码,Object [] args,区域设置语言环境);”方法被调用,因此必须重写才能获取正确的消息。

关于java - < Spring :message> tag not working with resource bundles from database,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26436775/

相关文章:

java - maven 如何知道依赖项使用哪个 repo?

java - Android Studio 中的 ndk.dir 错误

java - Spring Integration 错误 channel 未收到所有异常

java - jsp中的转义字符?

java - 当我点击 "+"按钮时,我应该显示 2,再次点击它应该显示 3。

java - 使用 MVC Java 显示素数

java - Spring Data Rest 重写嵌套属性 POST 处理程序

java - 不知道我在设置 Spring Boot REST 应用程序时做错了什么

mysql - 如何将CSV文件中的数据导入MySQL数据库

Spring应用程序中JSPX解析后的jQuery错误