【问题标题】:Vaadin internationalization issue: java.util.MissingResourceExceptionVaadin 国际化问题:java.util.MissingResourceException
【发布时间】:2014-03-18 15:38:22
【问题描述】:

我对 Vaadin 框架很陌生,我正在尝试制作一个国际化的应用程序。我正在使用 NetBeans,我已按照以下步骤操作:

  1. 使用单个 UI 类创建一个新的 Vaadin 项目 文本字段。
  2. 我进入了工具 -> 国际化 -> 国际化向导,并按照这些步骤将 UI 类国际化。

很简单。但是当我运行应用程序时,我得到了这个异常:

javax.servlet.ServletException: com.vaadin.server.ServiceException: java.util.MissingResourceException: Can't find bundle for base name com/mycompany/i18ntest/Bundle, locale es_AR
    com.vaadin.server.VaadinServlet.service(VaadinServlet.java:240)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)

异常提示 Bundle.properties 文件无法找到,但它与 UI 类存在于同一个包中:

MyVaadinUI.java

package com.mycompany.i18ntest;

import javax.servlet.annotation.WebServlet;
import com.vaadin.annotations.Theme;
import com.vaadin.annotations.VaadinServletConfiguration;
import com.vaadin.server.VaadinRequest;
import com.vaadin.server.VaadinServlet;
import com.vaadin.ui.FormLayout;
import com.vaadin.ui.TextField;
import com.vaadin.ui.UI;
import java.util.ResourceBundle;

@Theme("mytheme")
@SuppressWarnings("serial")
public class MyVaadinUI extends UI {

    private final ResourceBundle bundle = ResourceBundle.getBundle("com/mycompany/i18ntest/Bundle");

    @WebServlet(value = "/*", asyncSupported = true)
    @VaadinServletConfiguration(productionMode = false, ui = MyVaadinUI.class
                               , widgetset = "com.mycompany.i18ntest.AppWidgetSet")
    public static class Servlet extends VaadinServlet {
    }

    @Override
    protected void init(VaadinRequest request) {
        TextField textField = new TextField(bundle.getString("MyVaadinUI.textField.caption"));
        textField.setRequired(true);
        textField.setRequiredError(bundle.getString("MyVaadinUI.textField.requiredError"));

        final FormLayout layout = new FormLayout(textField);
        layout.setMargin(true);
        setContent(layout);       
    }
}

Bundle.properties

MyVaadinUI.textField.caption = User
MyVaadinUI.textField.requiredError = Please input your user name here

另外,我尝试将 .properties 文件重命名为 Bundle_es_AR.properties,因为我的浏览器的默认语言是西班牙语(es)阿根廷(AR),但没有运气,仍然出现异常。

【问题讨论】:

  • Bundle.properties 是否也包含在 WAR 文件中?
  • 不,不是!而且我不知道如何使 WAR 文件包含它。我正在检查所有项目属性选项,但我没有找到如何在项目部署中包含此文件。 @AndréSchild

标签: java maven netbeans vaadin vaadin7


【解决方案1】:

感谢@AndréSchild comment(谢谢)我意识到WAR 文件不包括Bundle.properties。在做了一些谷歌搜索后,我发现了如何通过在this article 中编辑pom.xml 文件来将资源包含到 Maven 项目中。它提供了两种不同的方法来解决我的问题:

将 .properties 文件放在资源文件夹中

默认情况下,Maven 会在下面查找您项目的资源 src/main/resources.

Project 
   |-- pom.xml
   `-- src
       `-- main
           `-- resources

这基本上说明我可以简单地将Bundle.properties 文件放在resources 文件夹中,它将包含在WAR 文件中。

此文件将位于类路径的根目录,因此我必须在 MyVaadinUI.java 类中进行此更改:

private final ResourceBundle bundle = ResourceBundle.getBundle("Bundle");

添加文件夹为资源编辑pom.xml文件

如果我们想添加一些没有放在src/main/resources文件夹中的资源,我们可以编辑pom.xml文件添加资源文件夹如下:

<project>
 ...
 <build>
   ...
   <resources>
     <resource>
       <directory>[our folder here]</directory>
     </resource>
   </resources>
   ...
 </build>
 ...
</project>

所以就我而言,我可以这样做:

<project>
 ...
 <build>
   ...
   <resources>
     <directory>src/main/java/com/mycompany/i18ntest</directory>
     <includes>
       <include>*.properties</include>
     </includes>
   </resources>
   ...
 </build>
 ...
</project>

当WAR文件生成时,它会在classpath的根目录包含指定资源文件夹的内容(除了/src/main/resources fodler的内容)。我必须再次进行此更改:

private final ResourceBundle bundle = ResourceBundle.getBundle("Bundle");

注意:尽管 NetBeans 显示资源文件夹中的所有文件,但由于此过滤器,WAR 文件中只会包含 .properties 文件:

     <includes>
       <include>*.properties</include>
     </includes>

【讨论】:

  • 您可以选择资源定义处的targetPath,而不是更改getBundle,如下所示:&lt;resource&gt; &lt;directory&gt;src/main/java/som/vaadin&lt;/directory&gt; &lt;targetPath&gt;path/to/the/bundle&lt;/targetPath&gt; &lt;includes&gt; &lt;include&gt;*.properties&lt;/include&gt; &lt;/includes&gt; &lt;/resource&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-29
  • 2021-03-21
  • 2015-04-24
相关资源
最近更新 更多