Visualizzazione dei risultati da 1 a 10 su 13

Hybrid View

  1. #1
    ho fatto queste modifiche, e pare funzionare tutto (poi dal punto di vista design non so).

    nell'enum imposto anche l'estensione del file da scaricare (in futuro magari aggiungo altre estensioni), e il tipo di operazione (r=lettura, quindi visualizzazione, r=scrittura quindi mi fa il download):
    codice:
    public enum MediaTypeAccepted {
        JSON("application/json", "", "r"),
        XLS("application/vnd.ms-excel", "xls", "w");
    
        private String value;
        private String ext;
        private String operation;
    
        MediaTypeAccepted(String value, String ext, String operation) {
            this.value = value;
            this.ext = ext;
            this.operation = operation;
        }
    
        public String getValue() {
            return value;
        }
    
        public String getExt() {
            return ext;
        }
    
        public String getOperation() {
            return operation;
        }
    }
    poi ho creato una classe che mi crea la Response.ResponseBuilder:
    codice:
    public class CreateResponse {
    
        private Object entity;
        private String mediaType;
        private String ext;
        private String operation;
    
        public CreateResponse(Object entity, String mediaType, String ext, String operation) {
            this.entity = entity;
            this.mediaType = mediaType;
            this.ext = ext;
            this.operation = operation;
        }
    
        public Response.ResponseBuilder create() throws IOException {
            Response.ResponseBuilder response = null;
            if (operation.equals("w")) {
                File file = File.createTempFile("export", "." + ext);
                response = Response.ok((Object) file, mediaType);
                response.header("Content-Disposition", "attachment; filename=" + file);
                file.deleteOnExit();
            } else {
                response = Response.ok(entity, mediaType);
            }
            return response;
        }
    }
    a seconda del tipo di operazione creo il file o meno (ovviamente la creazione prendendo i dati devo ancora impostarla).

    infine nel service:
    codice:
    @Path("test")
    public class TestService {
    
        @GET
        @Path("{mediaType}")
        public Response test(@PathParam("mediaType") String mediaType) {
            CreateResponse response;
            Response.ResponseBuilder rb;
            if (EnumUtils.isValidEnum(MediaTypeAccepted.class, mediaType.toUpperCase())) {
                ZonaQueries query = new ZonaQueries();
                ArrayList<Zona> list = null;
                String mt = MediaTypeAccepted.valueOf(mediaType.toUpperCase()).getValue();
                String ext = MediaTypeAccepted.valueOf(mediaType.toUpperCase()).getExt();
                String operation = MediaTypeAccepted.valueOf(mediaType.toUpperCase()).getOperation();
                try {
                    list = query.getAll();
                    response = new CreateResponse(list, mt, ext, operation);
                    rb = response.create();
                } catch (ClassNotFoundException | SQLException | IOException ex) {
                    throw new NotFoundException(new JsonError("Errore", ex.getMessage()));
                }
            } else {
                throw new NotFoundException(new JsonError("Errore", "File non supportato"));
            }
            return rb.build();
        }
    
    }
    funzionare funziona.....

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da fermat Visualizza il messaggio
    funzionare funziona.....
    Sì ma è molto "dispersivo". Comunque, ripeto, un conto è sfruttare la Content Negotiation "standard" che è fatta tramite il header "Accept" (che è il modo standard che un client usa per dire cosa accetta come content-type). In questo caso non c'è bisogno di alcun giro strano lato server. Basta sfruttare il @Produces avendo metodi differenti (ciascuno per un formato differente) con appunto @Produces differenti. La "negoziazione" a questo livello è fatta "a gratis" dalla implementazione di JAX-RS.

    Se invece fai una Content Negotiation "fai-da-te" (con path-param, query-param, header custom, estensione .qualcosa) .... beh, è un altro discorso ed è appunto tutto a tuo carico.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.