web-dev-qa-db-fra.com

Les ressources statiques d'accès à Spring Boot sont manquantes scr/main/resources

Je travaille sur une application Spring Boot. J'ai besoin d'analyser un fichier XML (countries.xml) au début. Le problème est que je ne comprends pas où le mettre pour pouvoir y accéder. La structure de mes dossiers est 

ProjectDirectory/src/main/Java
ProjectDirectory/src/main/resources/countries.xml

Ma première idée était de le placer dans src/main/resources, mais lorsque j'essaie de créer un fichier (countries.xml), je reçois un NPE et le stacktrace montre que mon fichier est consulté dans le répertoire ProjectDirectory (donc src/main/resources/n'est pas ajouté). J'ai essayé de créer un fichier (resources/countries.xml) et le chemin ressemblerait à ProjectDirectory/resources/countries.xml (donc encore une fois, src/main n'est pas ajouté).

J'ai essayé d'ajouter ceci sans résultat

@Override
public void addResourceHandlers(final ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
    registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
    super.addResourceHandlers(registry);
}

Je sais que je peux ajouter src/main/manuellement, mais je veux comprendre pourquoi cela ne fonctionne pas comme il se doit. J'ai aussi essayé des exemples avec ResourceLoader - avec le même résultat nul. 

Quelqu'un pourrait-il suggérer quel est le problème?

UPDATE: Juste pour des références futures - après la construction du projet, un problème d’accès au fichier s’est posé, j’ai donc changé File en InputStream. 

InputStream is = new ClassPathResource("countries.xml").getInputStream();
47
lenach87

Utilisez simplement le type Spring ClassPathResource .

File file = new ClassPathResource("countries.xml").getFile();

Tant que ce fichier est quelque part sur classpath, Spring le trouvera. Cela peut être src/main/resources pendant le développement et les tests. En production, il peut s'agir du répertoire en cours d'exécution.

95
luboskrnac

Lorsque vous travaillez avec l'application Spring Boot, il est difficile d'obtenir les ressources de chemin de classe à l'aide de resource.getFile() lorsqu’il est déployé en tant que JAR, car je rencontrais le même problème. Cette analyse sera résolue en utilisant Stream qui trouvera toutes les ressources placées n’importe où dans classpath.

Ci-dessous l'extrait de code pour la même chose -

ClassPathResource classPathResource = new ClassPathResource("fileName");
InputStream inputStream = classPathResource.getInputStream();
content = IOUtils.toString(inputStream);
8

Pour obtenir les fichiers dans le classpath:

Resource resource = new ClassPathResource("countries.xml");
File file = resource.getFile();

Pour lire le fichier onStartup, utilisez @PostConstruct:

@Configuration
public class ReadFileOnStartUp {

    @PostConstruct
    public void afterPropertiesSet() throws Exception {

        //Gets the XML file under src/main/resources folder
        Resource resource = new ClassPathResource("countries.xml");
        File file = resource.getFile();
        //Logic to read File.
    }
}

Voici un exemple Small permettant de lire un fichier XML au démarrage de Spring Boot App.

8
Sanjay Rawat

Vous pouvez utiliser le code suivant pour lire le fichier dans String à partir du dossier de ressources.

final Resource resource = new ClassPathResource("public.key");
String publicKey = null;
try {
     publicKey = new String(Files.readAllBytes(resource.getFile().toPath()), StandardCharsets.UTF_8);
} catch (IOException e) {
     e.printStackTrace();
}
1
snj

J'utilise bottes de printemps, donc je peux utiliser simplement:

File file = ResourceUtils.getFile("classpath:myfile.xml");
0
Galley

Vous devez utiliser la construction suivante 

InputStream in = getClass().getResourceAsStream("/yourFile");

Veuillez noter que vous devez ajouter cette barre oblique avant votre nom de fichier.

0
Andrew Gans

J'utilise Spring Boot, ma solution au problème était

"src/main/resources/myfile.extension"

J'espère que ça aide quelqu'un.

0
Nemanja Rajkovic