web-dev-qa-db-fra.com

Comment lire le fichier JSON à partir de ressources dans le démarrage

Utilisation du démarrage à ressort 2.1.5, avez créé le microservice de démarrage de ressort suivant:

Structure du projet Maven:

MicroService
    │
    pom.xml
    src
    │
    └───main
        │ 
        ├───Java
        │   │ 
        │   └───com
        │       └───microservice
        │           │
        │           └───MicroServiceApplication.Java  
        │  
        └───resources
            │
            └───data.json
                │                    
                application.properties

Demandez au fichier JSON suivant (à l'intérieur de SRC/Main/Ressources/Data.json):

{"firstName": "John", "lastName": "Doe"}

MicroserviceApplication:

@SpringBootApplication
public class MicroServiceApplication {

    @Bean
    CommandLineRunner runner() {
        return args -> {
            String data = FilePathUtils.readFileToString("../src/main/resources/data.json", MicroServiceApplication.class);
            System.out.println(data);
        };
    }

    public static void main(String[] args) {
        SpringApplication.run(MicroServiceApplication.class, args);
    }
}

Jette l'exception suivante:

  Java.lang.IllegalStateException: Failed to execute CommandLineRunner
  ...
  Caused by: Java.io.IOException: Stream is null

Filépathutils.java:

import io.micrometer.core.instrument.util.IOUtils;

import Java.io.IOException;
import Java.io.InputStream;
import Java.nio.charset.Charset;

public class FilePathUtils {
    public static String readFileToString(String path, Class aClazz) throws IOException {

        try (InputStream stream = aClazz.getClassLoader().getResourceAsStream(path)) {
            if (stream == null) {
                throw new IOException("Stream is null");
            }
            return IOUtils.toString(stream, Charset.defaultCharset());
        }
    }
}

Qu'est-ce que je fais peut-être mal?

4
PacificNW_Lover

Alors que @deadpool a fourni la réponse, j'aimerais ajouter que lorsque l'artefact de la chaussure de printemps est créé, il n'y a pas de tel src/main/ Dossier plus (vous pouvez ouvrir l'artefact de démarrage à ressort et vous assurer que vous-même).

Donc, vous ne peut pas charger des ressources telles que ceci:

FilePathUtils.readFileToString("../src/main/resources/data.json", MicroServiceApplication.class);

Printemps a en effet une abstraction appelée Resource qui peut être utilisé dans l'application, pouvant même être injectée dans les classes/configuration:

@Value("classpath:data/data.json")
Resource resourceFile;

Notez le préfixe "ClassPath" Cela signifie que la ressource sera résolue à partir de la classe de classe (lisez tout correctement emballé dans l'artefact).

Il y a un très bon tutoriel qui peut être pratique

1
Mark Bramnik

Vous pouvez utiliser jakson-databind .

La classe Jackson ObjectMapper (com.fasterxml.jackson.databind.ObjectMapper) est l'un des moyens les plus simples d'analyser JSON. Le Jackson ObjectMapper can parse JSON à partir d'une chaîne, d'un flux ou d'un fichier, et create a Java object or object graph représentant le JSON analysé. Parsing JSON In Java objets est également appelé deserialize Java objects de JSON.

// create Object Mapper
ObjectMapper mapper = new ObjectMapper();

// read JSON file and map/convert to Java POJO
try {
    SomeClass someClassObject = mapper.readValue(new File("../src/main/resources/data.json"), SomeClass.class);
    System.out.println(someClassObject);
} catch (IOException e) {
    e.printStackTrace();
}

et vous devriez avoir jakson-databind dans ton .pom fichier :

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.11.4</version>
</dependency>