es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , , ,

Answer

  1. Avatar for 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í:

    @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 = "file.json"; // ruta actualizada para reflejar la nueva ubicación en el classpath
            String jsonString;
            List<filemodel> fileList;
            try {
                InputStream is = getClass().getClassLoader().getResourceAsStream(file); // carga el archivo usando el classloader
                jsonString = new String(is.readAllBytes(), StandardCharsets.UTF_8); // lee el contenido del archivo
                fileList = mapper.readValue(jsonString, new TypeReference<><filemodel>>(){});
            } catch (IOException e) {
                LOG.error(e.getMessage());
                return HttpResponse.serverError();
            }
            return HttpResponse.ok(fileList);
        }
    }
    

    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.

Comments are closed.