java - parser - spring boot validate request body
Leer el archivo de la carpeta de recursos en Spring Boot (6)
Estoy usando Spring Boot y json-schema-validator
. Estoy intentando leer un archivo llamado jsonschema.json
de la carpeta de resources
. He intentado de varias maneras diferentes pero no puedo hacerlo funcionar. Este es mi código.
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("jsonschema.json").getFile());
JsonNode mySchema = JsonLoader.fromFile(file);
Esta es la ubicación del archivo.
Y aquí puedo ver el archivo en la carpeta de classes
.
Pero cuando ejecuto el código me sale el siguiente error.
jsonSchemaValidator error: java.io.FileNotFoundException: /home/user/Dev/Java/Java%20Programs/SystemRoutines/target/classes/jsonschema.json (No such file or directory)
¿Qué es lo que estoy haciendo mal en mi código?
Aquí está mi solución. Puede ayudar a alguien;
Devuelve InputStream, pero supongo que también puedes leerlo.
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("jsonschema.json");
Después de pasar mucho tiempo tratando de resolver este problema, finalmente encontré una solución que funciona. La solución hace uso de los ResourceUtils de Spring. Debería funcionar para archivos json también.
Gracias por la página bien escrita por Lokesh Gupta: Blog
package utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.ResourceUtils;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.io.File;
public class Utils {
private static final Logger LOGGER = LoggerFactory.getLogger(Utils.class.getName());
public static Properties fetchProperties(){
Properties properties = new Properties();
try {
File file = ResourceUtils.getFile("classpath:application.properties");
InputStream in = new FileInputStream(file);
properties.load(in);
} catch (IOException e) {
LOGGER.error(e.getMessage());
}
return properties;
}
}
Respuesta muy breve: está buscando su propiedad en el ámbito de un cargador de clases particular en lugar de su clase objetivo. Esto debería funcionar:
File file = new File(getClass().getResource("jsonschema.json").getFile());
JsonNode mySchema = JsonLoader.fromFile(file);
También, vea esto:
- ¿Cuál es la diferencia entre Class.getResource () y ClassLoader.getResource ()?
- Comportamiento extraño de Class.getResource () y ClassLoader.getResource () en un jar ejecutable
- Cargando recursos usando getClass (). GetResource ()
PD: puede haber un problema si el proyecto se ha compilado en una máquina y luego se ha iniciado en otra o si ejecuta su aplicación en Docker. En este caso, las rutas a su carpeta de recursos pueden ser inválidas. En este caso, sería mejor determinar las rutas a sus recursos en tiempo de ejecución:
ClassPathResource res = new ClassPathResource("jsonschema.json");
File file = new File(res.getPath());
JsonNode mySchema = JsonLoader.fromFile(file);
Si tiene, por ejemplo, la carpeta de configuración en la carpeta de recursos, he intentado que esta clase funcione perfectamente.
File file = ResourceUtils.getFile("classpath:config/sample.txt")
//Read File Content
String content = new String(Files.readAllBytes(file.toPath()));
System.out.println(content);
atrapado en el mismo tema esto me ayuda
URL resource = getClass().getClassLoader().getResource("jsonschema.json");
JsonNode jsonNode = JsonLoader.fromURL(resource);