我对Vaadin框架很陌生,我试图制作一个国际化的应用程序。我使用NetBeans,我已按照以下步骤操作:
非常简单。但是当我运行应用程序时,我得到了这个例外:
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类相同的包中:
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);
}
}
MyVaadinUI.textField.caption = User
MyVaadinUI.textField.requiredError = Please input your user name here
另外,我已经尝试将.properties
文件重新命名为Bundle_es_AR.properties
,因为我的浏览器的默认语言是西班牙语(阿根廷语),但没有运气,仍然得到例外。
答案 0 :(得分:1)
感谢@AndréSchildcomment(谢谢)我意识到WAR文件不包括Bundle.properties
。在进行了一些Google搜索之后,我找到了如何通过编辑this article中的pom.xml
文件来将资源包含到Maven项目中。它提出了两种不同的方法来解决我的问题:
默认情况下,Maven会在下面查找您项目的资源
src/main/resources
。Project |-- pom.xml `-- src `-- main `-- resources
这基本上表明我可以简单地将Bundle.properties
文件放在resources
文件夹中,它将包含在WAR文件中。
此文件将位于classpath的根目录中,因此我必须在MyVaadinUI.java
类中执行此更改:
private final ResourceBundle bundle = ResourceBundle.getBundle("Bundle");
如果我们想要添加一些未放在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>