JSP找不到用于i18n的默认资源包。

3

在整个互联网上浏览后,我最终提出了这个问题,尽管我觉得有点难以描述情况。

我有一个小应用程序,它在嵌入式Tomcat服务器(v7)上运行,并使用servlet和JSP;我试图使用JSTL标记对它们进行国际化。最终的项目部署为JAR文件,当我从控制台使用java -jar运行它时,内嵌服务器正常启动,一切都很好。

问题是,当我尝试在IDE(我使用IntelliJ Idea v13.1.2)中运行它时:它再次启动,但页面显示的值不是来自bundle,而是像"???default.username???"这样的值。

这里是我的JSP大多数情况下的样子:

<!DOCTYPE html>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="language"
   value="${not empty param.language ? param.language : not empty language ? language : pageContext.request.locale}"
   scope="session"/>
<fmt:setLocale value="${language}"/>
<fmt:setBundle basename="messages" scope="session" var="bund"/>

<html>
<head>
    <title><fmt:message bundle="${bund}" key="default.title" /></title>
    <link rel="stylesheet" type="text/css" href="../css/tdb.css" media="all">
</head>

等等。 当我使用JAR时,<fmt:message bundle="${bund}" key="default.title" />和类似的部分完美地工作,并导致从IDE中获得 ???default.title??? 的结果。 在某种情况下,我从servlet中使用bundle文件,并且当从JAR运行时,它可以正常工作,而当从IDE中运行时,它会导致java.util.MissingResourceException

我到目前为止尝试了什么? 我在各种位置中添加了我的messages.properties和messages_en_US.properties文件(在资源文件夹中,与java和webapp文件夹处于相同级别;在com.my.example包中的单独包中;作为简单的属性文件在com.my.example包中),尝试只使用基本名称引用它(resourceBundle = ResourceBundle.getBundle("messages", locale);),或者使用完全限定路径;还设置了web.xml文件中的fallbackLocale和localizationContext参数。

我错过了什么?

2个回答

0

代码看起来很好。

我正在检查我的一些项目,我有这些属性:

<fmt:setBundle basename="org.juanitodread.msg.label" var="label"/>


<fmt:message key="common.title" bundle="${label}" />

我的项目在Eclipse中,但是你可以尝试不使用“scope”属性。我的label.properties文件在“org.juanitodread.msg”包中。


我尝试了有和没有作用域、有和没有更长的路径,但是都没有解决方案可行。不过还是谢谢。 - Akabelle

0

我也使用Intellij Idea并遇到了类似的问题,以下是我的结论。你应该将你的“messages file”放到

yourproject/src/main/java/resources 

文件夹(通常情况下,Idea将使用指定标志突出显示资源文件夹图标)。我在web.xml中没有备用语言环境配置和本地化上下文参数。我的bundle文件名为messages_en.properties,并且我以以下方式使用它

<fmt:setBundle basename="messages" var="labels" />

不要将“resources.messages”添加到basename属性中。 我正在运行IntellijIdea 2016.2版本,我的应用程序在以下环境下正常工作:

为了检查您的资源是否真正加载(如果您的属性未加载到页面上,那么显然您缺少文件),请使用以下代码,如https://dev59.com/hVHTa4cB1Zd3GeqPUMDt#4137991所述。

ClassLoader ctxLoader = Thread.currentThread().getContextClassLoader();
URL propsURL = ctxLoader.getResource("opto-mapping.properties");
URLConnection propsConn = propsURL.openConnection();

如果您已经加载了资源,openConnection 将会抛出一个异常,表示连接到 messages.properties 已经打开(至少我是这样做的,并尝试让我的 bundle 工作了很长时间)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接