我有一个使用RPC的GWT / AppEngine项目。基本上我需要从驻留在服务器上的XML文件中获取一些数据。但是当我使用RPC来读取我的服务器包中的文件时,我得到了AccessControlException (access denied)
。任何想法是什么问题?
//JAXB powered XML Parser
public PoiList readXML() {
try {
unmarshaller = jaxbContext.createUnmarshaller();
unmarshaller.setEventHandler(new XMLValidEventHandler());
db = (PoiList) unmarshaller.unmarshal(new File("src/com/sem/server/source.xml"));
} catch (JAXBException e) {
e.printStackTrace();
}
return db;
}
java.security.AccessControlException: access denied (java.io.FilePermission \WEB-INF\classes\com\sem\server read)
欢呼声恶作剧
答案 0 :(得分:1)
我认为问题在于您正在尝试读取不在工作目录中的文件。在gwt应用程序中构建代码的指导原则如下
在主项目目录下 创建以下目录:
- src文件夹 - 包含生产Java源代码
- war文件夹 - 您的网络应用;包含静态资源以及编译输出
- 测试文件夹 - (可选)JUnit测试代码将在此处
尝试将文件移动到war目录(例如/war/resources/myFile.xml),然后通过
打开它File myFile = new File(System.getProperty("user.dir") + "/resources/myFile.xml");
答案 1 :(得分:0)
通常,当您加载位于类路径中的资源时,不应使用java.io.File。为什么?因为它很可能,没有真正的文件 - 这些类通常打包为.jar文件,甚至以完全不同的方式加载(很可能是在AppEngine的情况下,虽然我不知道细节。)
因此,如果要直接从类路径加载它,可以使用:
ClassLoader classLoader =
getClass().getClassLoader(); // Or some other way to
// get the correct ClassLoader
InputStream is = classloader.getResourceAsStream("/com/sem/server/source.xml");
然后您可以在unmarshaller中使用输入流。