我初次接触Google AppEngine 刚写完一段Java代码,不想出现问题,那一段程序的用Dom4j进行xml文件的操作,出现问的部分是写xml文件的时候!调试的时候的异常提示为:HTTP ERROR: 500
access denied (java.io.FilePermission E:\work\telbook\war\member.xml write)
RequestURI=/servlet/post.doCaused by:
java.security.AccessControlException: access denied (java.io.FilePermission E:\work\telbook\war\member.xml write)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:264)
at java.security.AccessController.checkPermission(AccessController.java:427)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkPermission(DevAppServerFactory.java:139)
at java.lang.SecurityManager.checkWrite(SecurityManager.java:962)
at java.io.FileOutputStream.(FileOutputStream.java:169)
at java.io.FileOutputStream.(FileOutputStream.java:131)
at java.io.FileWriter.(FileWriter.java:73)
at cn.xioyo.telbook.util.DocumentUtils.writeDocument2XmlFile(DocumentUtils.java:33)
at cn.xioyo.telbook.dao.impl.DaoMemberImpl.saveMember(DaoMemberImpl.java:31)
at cn.xioyo.telbook.Post.doPost(Post.java:40)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:713)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1093)
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:121)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:54)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:313)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
at org.mortbay.jetty.Server.handle(Server.java:313)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:506)
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:844)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:644)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:381)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:396)
at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:442)
不知道是不是Google AppEngine不支持文件的写操作?

解决方案 »

  1.   

    确实是不支持写操作
    请查看官方文档为了使得 App Engine 能够跨多个网络服务器分配对于应用程序的请求,并且防止应用程序彼此干扰,请在受限制的“沙盒”环境中运行应用程序。在这种环境中,该应用程序可执行代码;可存储和查询 App Engine 数据存储区中的数据;可使用 App Engine 邮件、网址抓取和用户服务;可检查用户的网络请求以及准备响应。App Engine 应用程序无法:    * 向文件系统写入。应用程序必须使用 App Engine 数据存储区存储永久数据。允许从文件系统中读取,并且可使用与该应用程序一起上传的所有应用程序文件。
        * 打开套接字或直接访问另一主机。应用程序可使用 App Engine 网址抓取服务分别向端口 80 和 443 上的其他主机发出 HTTP 和 HTTPS 请求。
        * 产生子进程或线程。必须在几秒钟内于单个进程中处理对应用程序的网络请求。响应时间很长的进程会被终止,以避免使网络服务器负载过重。
        * 进行其他类型的系统调用。线程Java 应用程序无法新建 java.lang.ThreadGroup 或 java.lang.Thread。这些限制也适用于利用线程的 JRE 类。例如,应用程序无法新建 java.util.concurrent.ThreadPoolExecutor 或 java.util.Timer。应用程序可以对当前线程执行操作,如 Thread.currentThread().dumpStack()。
    文件系统Java 应用程序无法使用任何用来写入文件系统的类,如 java.io.FileWriter。应用程序可以使用诸如 java.io.FileReader 的类从文件系统中读取自己的文件。应用程序也可以通过例如 Class.getResource() 或 ServletContext.getResource() 来访问作为“资源”的自身文件。只有视为“资源文件”的文件才可以由应用程序通过文件系统访问。默认情况下,WAR 中的所有文件都是“资源文件”。您可以使用 appengine-web.xml 文件将文件从该组中排除出去。
    java.lang.System禁用不适用于 App Engine 的 java.lang.System 类的功能。以下 System 方法在 App Engine 中不起作用:exit()、gc()、runFinalization()、runFinalizersOnExit()以下 System 方法返回 null:inheritedChannel()、console()应用程序无法提供或直接调用任何本机 JNI 代码。以下 System 方法引发 java.lang.SecurityException:load()、loadLibrary()、setSecurityManager()
    反射允许应用程序对自己的类进行完全、无限制的反射访问。它可以查询任何私有成员,使用 java.lang.reflect.AccessibleObject.setAccessible(),以及读取/设置私有成员。应用程序还可以对 JRE 和 API 类(如 java.lang.String 和 javax.servlet.http.HttpServletRequest)进行反射。但是,它只可以访问这些类的公共成员,而不可以访问受保护成员或私有成员。应用程序无法对不属于自己的任何其他类进行反射,也无法使用 setAccessible() 方法来避开这些限制。
    自定义类载入App Engine 完全支持自定义类载入。但是请注意,App Engine 将覆盖所有的 ClassLoader,以将相同的权限分配给所有由应用程序载入的类。如果执行自定义类载入,在载入不信任的第三方代码时要小心。