Vaadin国际化问题:java.util.MissingResourceException

时间:2014-03-18 15:38:22

标签: java maven netbeans vaadin vaadin7

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

  1. 使用单个UI类创建一个新的Vaadin项目 文字字段就可以了。
  2. 我去了工具 - >国际化 - >国际化向导并遵循这些步骤来国际化UI类。
  3. 非常简单。但是当我运行应用程序时,我得到了这个例外:

    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类相同的包中:

    enter image description here

    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,因为我的浏览器的默认语言是西班牙语(阿根廷语),但没有运气,仍然得到例外。

1 个答案:

答案 0 :(得分:1)

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

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

  

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

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

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

enter image description here

此文件将位于classpath的根目录中,因此我必须在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文件时,它将在类路径的根目录中包含指定资源文件夹的内容(除了/src/main/resources fodler内容之外)。我必须再次做这个改变:

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

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

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

enter image description here