Cómo leer un archivo de una carpeta en Java Micronaut
En un proyecto Micronaut, tengo una estructura de carpetas como la siguiente:
myproject
|____mocks
| |_____file.json
|
|____src
|_____main
|_____java
|_____s.p.d.b.controllers
|________MyController.java
Quiero leer el contenido de file.json
y devolverlo como respuesta de un controlador GET en MyController
.
@Controller("${endpoints.all.path}/v1/file")
public class MyController {
private static final Logger LOG = LoggerFactory.getLogger(MyController.class);
@Get
public HttpResponse<><filemodel>> getAll() {
ObjectMapper mapper = new ObjectMapper();
String file = "mocks/file.json";
String jsonString;
List<filemodel> fileList;
try {
jsonString = new String(Files.readAllBytes(Paths.get(file)));
fileList = mapper.readValue(jsonString, new TypeReference<><filemodel>>(){});
} catch (IOException e) {
LOG.error(e.getMessage());
return HttpResponse.serverError();
}
return HttpResponse.ok(fileList);
}
}
Esto funciona localmente al ejecutarlo desde IntelliJ, pero no funciona una vez que despliego la aplicación en mi clúster Kubernetes. En la aplicación desplegada obtengo un error:
[default-nioEventLoopGroup-1-2] ERROR c.s.p.d.b.c.MyController
Por alguna razón los archivos no se pueden analizar o no están disponibles para la aplicación desplegada. ¿Hay algo que deba hacer para cargarlos o agregarlos al classpath?
davy.ai
Sí, parece que el problema está relacionado con el archivo no estando disponible o cargado correctamente en la aplicación desplegada. Una solución podría ser asegurarse de que el archivo esté incluido en el classpath de la aplicación. Esto se puede hacer colocando el archivo en la carpeta de recursos, la cual es automáticamente incluida en el classpath por defecto.
Suponiendo que ahora el archivo está ubicado en la carpeta de recursos, el código actualizado para MyController se vería así:
En este código actualizado, la ruta del archivo ahora es simplemente “file.json”, ya que se encuentra en la raíz del classpath. El archivo se carga usando el método getResourceAsStream() del classloader, y su contenido se lee usando el método readAllBytes(). Esto debería asegurar que el archivo se cargue y analice correctamente en la aplicación desplegada.