2010-06-13 4 views
1

J'ai un petit projet GWT/AppEngine qui utilise RPC. Fondamentalement, j'ai besoin d'obtenir des données à partir d'un fichier XML qui réside sur le serveur. Mais quand j'utilise le RPC pour lire le fichier dans mon paquet-serveur, je reçois un AccessControlException (access denied). Des idées quel est le problème?autorisation de fichier gwt

//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) 

hourras canular

+0

Souhaitez-vous nous montrer votre code pour lire le côté serveur de fichiers, s'il vous plaît? –

Répondre

1

Je pense que le problème est que vous essayez de lire un fichier qui ne se trouve pas dans votre répertoire de travail. Les guidlines pour structurer votre code dans les applications GWT sont les suivantes

Dans le répertoire principal du projet créer les répertoires suivants:

  • dossier src - contient la production source Java
  • dossier
  • de guerre - votre web app; contient des ressources statiques, ainsi que la production compilé
  • dossier test - (facultatif) code de test JUnit irait ici

Essayez de déplacer le fichier dans le répertoire de guerre (par exemple /war/resources/myFile.xml) puis ouvrez-le par

File myFile = new File(System.getProperty("user.dir") + "/resources/myFile.xml"); 
0

Habituellement, lorsque vous chargez une ressource qui se trouve dans votre classpath, vous utilisez should't java.io.File. Pourquoi? Parce que c'est très possible, qu'il n'y a pas de vrai fichier - les classes sont souvent empaquetées sous forme de fichier .jar, ou même chargées de façon totalement différente (très probablement dans le cas d'AppEngine, bien que je ne connaisse pas les détails .)

donc, si vous voulez le charger directement depuis votre classpath, vous pouvez utiliser:

ClassLoader classLoader = 
     getClass().getClassLoader(); // Or some other way to 
            // get the correct ClassLoader 
InputStream is = classloader.getResourceAsStream("/com/sem/server/source.xml"); 

Ensuite, vous pouvez utiliser le flux d'entrée dans votre unmarshaller.