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?
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
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>