Problema con libreria grafi e awt

di il
2 risposte

Problema con libreria grafi e awt

Sto sviluppando un'applicazione web che fra le altre cose crea dinamicamente dei grafi. Il grafo viene salvato su disco come PNG e visualizzato in una finestra modale. Al momento sto usando una delle varie librerie jgraphx presenti su maven e in locale funzione tutto. Il problema nasce una volta eseguita l'applicazione sul server di produzione. Per scrivere l'immagine sul disco uso:

import javax.imageio.ImageIO;
import java.awt.Color;
import java.awt.image.BufferedImage;
.
.
.
BufferedImage image = mxCellRenderer.createBufferedImage(graph, null, 1, Color.white, true, null);
ImageIO.write(image, "PNG", new File("public/metalweb/images/" + lig_id + "_" + typo + ".png"));
E questo genera un:
play.api.UnexpectedException: Unexpected exception[HeadlessException: 
No X11 DISPLAY variable was set, but this program performed an operation which requires it.]
.
.
Caused by: java.awt.HeadlessException: 
No X11 DISPLAY variable was set, but this program performed an operation which requires it.
Qualcuno mi ha suggerito di passare a Java -Djava.awt.headless=true ma non funziona.

Avete suggerimenti per risolvere questo problema?

2 Risposte

  • Re: Problema con libreria grafi e awt

    morellik ha scritto:


    Qualcuno mi ha suggerito di passare a Java -Djava.awt.headless=true ma non funziona.
    Bisogna vedere dove l'hai applicato.

    Comunque riguardo la questione del "headless" c'è della documentazione ufficiale: Using Headless Mode in the Java SE Platform

    Dovresti anche precisare bene quale è il punto in cui viene scatenato il HeadlessException. Non conosco quella jgraphx citata, quindi bisogna chiarire cosa di essa ha causato il problema. Non è sicuramente la ImageIO, perché non causa HeadlessException. Non so invece cosa sia quel mxCellRenderer.

    Noto però anche un altro potenziale problema: new File("public/metalweb/images/" + ......)
    Questo è un percorso relativo alla directory "corrente". Quale è? Beh, in una web application è generalmente abbastanza "vaga" nel senso che dipende da quale è l'application server, da come è configurato, da come è stato lanciato. Quindi nelle webapp Java la directory "corrente" generalmente non è usabile e non ci si dovrebbe far troppo affidamento.
    Quindi sarebbe meglio configurare un path assoluto o dedurlo in altro modo.
  • Re: Problema con libreria grafi e awt

    andbin ha scritto:


    morellik ha scritto:


    Qualcuno mi ha suggerito di passare a Java -Djava.awt.headless=true ma non funziona.
    Bisogna vedere dove l'hai applicato.

    Comunque riguardo la questione del "headless" c'è della documentazione ufficiale: Using Headless Mode in the Java SE Platform

    Dovresti anche precisare bene quale è il punto in cui viene scatenato il HeadlessException. Non conosco quella jgraphx citata, quindi bisogna chiarire cosa di essa ha causato il problema. Non è sicuramente la ImageIO, perché non causa HeadlessException. Non so invece cosa sia quel mxCellRenderer.
    Questa e' la libreria che uso per generare i grafi: https://jgraph.github.io/mxgraph/docs/manual_javavis.html
    Ti posto l'intero metodo:
    
    public Result getInteractionImage() throws IOException {
            DynamicForm requestData = formFactory.form().bindFromRequest();
            Integer lig_id = Integer.parseInt(requestData.get("lig_id"));
            String typo = requestData.get("typo");
            List<? extends InteractionHbond> interactions;
            if(typo.equals("1")) {
                interactions = ihbond.findByLigId(lig_id);
    
            } else {
                interactions = ivwd.findByLigId(lig_id);
            }
    
            //System.out.println(lig_id);
            mxGraph graph = new mxGraph();
            Object parent = graph.getDefaultParent();
    
            Boolean first = Boolean.TRUE;
            Object v1 = null;
            Object v = null;
            Integer y = 150;
            graph.getModel().beginUpdate();
            List<String> nBorList = new ArrayList<>();
            for (InteractionHbond ib : interactions) {
                for (Atom at : ib.getAtoms()) {
    
                    String[] neigRes = at.getNeigh_atom_str().split(" ");
    
                    if(first) {
                        String[] ligRes = at.getLig_atom_str().split(" ");
                        v1 = graph.insertVertex(parent, null, ligRes[0]+"_"+ligRes[1], 20, 20, 80,
                                30, "shape=ellipse;perimeter=ellipsePerimeter;strokeColor=blank;fillColor=violet");
                        first = Boolean.FALSE;
                    }
    
                    if(!nBorList.contains(neigRes[0]+"_"+neigRes[1])) {
                        nBorList.add(neigRes[0]+"_"+neigRes[1]);
    
                        v = graph.insertVertex(parent, null, neigRes[0]+"_"+neigRes[1], 240, y,
                            80, 30, "shape=ellipse;perimeter=ellipsePerimeter;strokeColor=black;fillColor=orange");
    
                        graph.insertEdge(parent, null, "", v1, v);
    
                        y +=50;
                    }
                }
            }
    
            graph.getModel().endUpdate();
    
            mxGraphComponent graphComponent = new mxGraphComponent(graph);
    
            BufferedImage image = mxCellRenderer.createBufferedImage(graph, null, 1, Color.white, true, null);
            ImageIO.write(image, "PNG", new File("public/metalweb/images/" + lig_id + "_" + typo + ".png"));
            String img = "<img src=\"/assets/metalweb/images/" + lig_id + "_" + typo + ".png\" >";
            return ok(img);
    
        }
    Con l'opzione -Djava.awt.headless=true ho la seguente exception:
    
    play.api.UnexpectedException: Unexpected exception[HeadlessException: null]
    .
    .
    Caused by: java.awt.HeadlessException: null
    	at java.awt.dnd.DragSource.<init>(DragSource.java:258)
    	at com.mxgraph.swing.handler.mxGraphHandler.installDragGestureHandler(Unknown Source)
    	at com.mxgraph.swing.handler.mxGraphHandler.<init>(Unknown Source)
    	at com.mxgraph.swing.mxGraphComponent.createGraphHandler(Unknown Source)
    	at com.mxgraph.swing.mxGraphComponent.createHandlers(Unknown Source)
    	at com.mxgraph.swing.mxGraphComponent.<init>(Unknown Source)
    	at controllers.ResultController.getInteractionImage(ResultController.java:199)
    
    Noto però anche un altro potenziale problema: new File("public/metalweb/images/" + ......)
    Questo è un percorso relativo alla directory "corrente". Quale è? Beh, in una web application è generalmente abbastanza "vaga" nel senso che dipende da quale è l'application server, da come è configurato, da come è stato lanciato. Quindi nelle webapp Java la directory "corrente" generalmente non è usabile e non ci si dovrebbe far troppo affidamento.
    Quindi sarebbe meglio configurare un path assoluto o dedurlo in altro modo.
    Sto usando Play Framework dove solitamente si lavora per path relativi. L'application server interno sa benissimo qual e' la root. Posso impostare anche una variabile nella sua configurazione, ma si tratta sempre di percorsi relativi.
Devi accedere o registrarti per scrivere nel forum
2 risposte