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.

Vaadin navegando hacia @RequestMapping.

Estoy creando una aplicación web utilizando Springboot y Vaadin.
He escrito un controlador que implementa un método @RequestMapping. Este método genera un PDF que debería poder ver o descargar en un navegador.

Si accedo directamente al enlace, todo funciona. Sin embargo, cuando uso la navegación de Vaadin, obtengo algunos errores. (Pero cuando actualizo esa página, funciona).

A continuación puedes encontrar mi código:

@RestController
public class PDFController {

@RequestMapping(value = "fichedownload", method = RequestMethod.GET, produces = MediaType.APPLICATION_PDF_VALUE)
public static ResponseEntity<inputstreamresource> ficheReport() throws IOException {

    ByteArrayInputStream bis = GeneratePdfReport.ficheReport();
    HttpHeaders headers = new HttpHeaders();

    // Descarga
    //headers.add("Content-Disposition", "attachment; filename=fiche.pdf");

    // Ver en el navegador
    headers.add("Content-Disposition", "inline; filename=fiche.pdf");

    return ResponseEntity
            .ok()
            .headers(headers)
            .contentType(MediaType.APPLICATION_PDF)
            .body(new InputStreamResource(bis));
}

}

En alguna vista de Vaadin:

Button generatePDF = new Button();
generatePDF.addClickListener(event->{
UI.getCurrent().navigate(“fichedownload”);
});

El enlace manual a ‘http://localhost:8080/fichedownload’ me da el resultado esperado.

El botón generatePDF navega a ‘http://localhost:8080/fichedownload’, pero muestra un error ‘No se encontró una ruta para ‘fichedownload’.’
¿Debo establecer una ruta o la navegación no ‘activa’ el @RequestMapping?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    En Vaadin, al acceder a una URL específica no se activa el método @RequestMapping en el controlador. En su lugar, intenta encontrar una vista de Vaadin con una ruta de URL coincidente.

    Para solucionar el problema, tienes dos opciones:

    1. Definir una vista de Vaadin con la ruta fichedownload:
      En tu clase anotada con @Route de Vaadin, agrega el valor fichedownload a la anotación @Route:
    @Route("fichedownload")
    public class PDFDownloadView extends Div {
       // ...
    }
    
    1. Usa Page para navegar directamente a la URL:
      En lugar de utilizar UI.getCurrent().navigate("fichedownload");, puedes navegar directamente a la URL utilizando Page.getCurrent().open("fichedownload", "_self");. Esto no activará una navegación de vista de Vaadin y abrirá la URL en la ventana/pestaña actual.
    Button generatePDF = new Button();
    generatePDF.addClickListener(event -> {
       Page.getCurrent().open("fichedownload", "_self");
    });
    

Comments are closed.