IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement Web en Java Discussion :

[Vert.X] Problème avec l'utilisation de HandlebarsTemplateEngine


Sujet :

Développement Web en Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2015
    Messages : 9
    Points : 11
    Points
    11
    Par défaut [Vert.X] Problème avec l'utilisation de HandlebarsTemplateEngine
    Bonjour,


    depuis peu, je fais joujou avec Vert.X, çà tournait plutôt bien, jusqu'à ce que je tente d'incorporer le moteur de Template HandleBars qui d'après la doc fonctionne très bien, mais les exemples sont peu nombreux et incomplets.

    Dans mon cas, mon soucis semble venir du path de mon fichier .hbs (format de fichier template handleBars)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    package com.vertxtest.test_vertx_01;
     
    import io.vertx.core.AbstractVerticle;
    import io.vertx.ext.web.Router;
    import io.vertx.ext.web.Session;
    import io.vertx.ext.web.handler.TemplateHandler;
    import io.vertx.ext.web.templ.HandlebarsTemplateEngine;
    import io.vertx.ext.web.templ.TemplateEngine;
     
    public class HelloWorld extends AbstractVerticle {
     
        public static final String APPLICATION_JSON = "application/json";
        final Router router = Router.router(vertx);
     
        @Override
        public void start() throws Exception {
     
            // In order to use a template we first need to create an engine
            final TemplateEngine engine = HandlebarsTemplateEngine.create();
            TemplateHandler handler = TemplateHandler.create(engine);
     
     
            router.get("/dynamic/").handler(handler);
     
     
            // Route all GET requests for resource ending in .hbs to the template
            // handler
            router.getWithRegex(".+\\.hbs").handler(context -> {
                final Session session=context.session();
                context.data().put("userLogin",session.get("login"));
                context.data().put("accessToken",session.get("accessToken"));
                context.next();
            });
     
             router.get("/hello/").handler(
                    req -> {
                        req.response().putHeader("content-type", "text/html")
                            .end("<html><body><h1>Hello World</h1></body></html>");
                    System.out.println(req.request().getParam("toto").trim());
                    });
     
     
     
            vertx.createHttpServer().requestHandler(router::accept).listen(8989, res -> {
                if (res.succeeded()) {
                    System.out.println("success: " + res.toString());
                } else {
                    System.out.println("failed : " + res.cause());
                }
            });
        }
    }
    Lorsque je tente d'accèder à l'url http://localhost:8989/dynamic, j'obtiens l'erreur suivante, qui résulte d'un problème lors de la tentative de lecture du fichier hbs depuis la méthode vert.X readFileToString :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    juil. 13, 2016 5:42:47 PM io.vertx.core.impl.BlockedThreadChecker
    AVERTISSEMENT: Thread Thread[vert.x-eventloop-thread-2,5,main] has been blocked for 720 ms, time limit is 0
    juil. 13, 2016 5:42:48 PM io.vertx.core.impl.BlockedThreadChecker
    AVERTISSEMENT: Thread Thread[vert.x-eventloop-thread-2,5,main] has been blocked for 1720 ms, time limit is 0
    juil. 13, 2016 5:42:49 PM io.vertx.core.impl.BlockedThreadChecker
    AVERTISSEMENT: Thread Thread[vert.x-eventloop-thread-2,5,main] has been blocked for 2720 ms, time limit is 0
    juil. 13, 2016 5:42:50 PM io.vertx.ext.web.impl.RoutingContextImplBase
    GRAVE: Unexpected exception in route
    io.vertx.core.VertxException: java.lang.NullPointerException
    	at io.vertx.ext.web.impl.Utils.readFileToString(Utils.java:156)
    	at io.vertx.ext.web.templ.impl.HandlebarsTemplateEngineImpl$Loader.sourceAt(HandlebarsTemplateEngineImpl.java:91)
    	at com.github.jknack.handlebars.Handlebars.compile(Handlebars.java:411)
    	at com.github.jknack.handlebars.Handlebars.compile(Handlebars.java:397)
    	at io.vertx.ext.web.templ.impl.HandlebarsTemplateEngineImpl.render(HandlebarsTemplateEngineImpl.java:64)
    	at io.vertx.ext.web.handler.impl.TemplateHandlerImpl.handle(TemplateHandlerImpl.java:61)
    	at io.vertx.ext.web.handler.impl.TemplateHandlerImpl.handle(TemplateHandlerImpl.java:45)
    	at io.vertx.ext.web.impl.RouteImpl.handleContext(RouteImpl.java:218)
    	at io.vertx.ext.web.impl.RoutingContextImplBase.iterateNext(RoutingContextImplBase.java:67)
    	at io.vertx.ext.web.impl.RoutingContextImpl.next(RoutingContextImpl.java:96)
    	at io.vertx.ext.web.impl.RouterImpl.accept(RouterImpl.java:61)
    	at io.vertx.core.http.impl.ServerConnection.handleRequest(ServerConnection.java:276)
    	at io.vertx.core.http.impl.ServerConnection.processMessage(ServerConnection.java:391)
    	at io.vertx.core.http.impl.ServerConnection.handleMessage(ServerConnection.java:137)
    	at io.vertx.core.http.impl.HttpServerImpl$ServerHandler.lambda$createConnAndHandle$24(HttpServerImpl.java:539)
    	at io.vertx.core.impl.ContextImpl.lambda$wrapTask$15(ContextImpl.java:312)
    	at io.vertx.core.impl.ContextImpl.executeFromIO(ContextImpl.java:217)
    	at io.vertx.core.http.impl.HttpServerImpl$ServerHandler.createConnAndHandle(HttpServerImpl.java:537)
    	at io.vertx.core.http.impl.HttpServerImpl$ServerHandler.doMessageReceived(HttpServerImpl.java:474)
    	at io.vertx.core.http.impl.HttpServerImpl$ServerHandler.doMessageReceived(HttpServerImpl.java:425)
    	at io.vertx.core.http.impl.VertxHttpHandler.channelRead(VertxHttpHandler.java:85)
    	at io.vertx.core.net.impl.VertxHandler.channelRead(VertxHandler.java:124)
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:308)
    	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:294)
    	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:244)
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:308)
    	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:294)
    	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:846)
    	at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:131)
    	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:511)
    	at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:468)
    	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:382)
    	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354)
    	at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:111)
    	at java.lang.Thread.run(Thread.java:745)
    Caused by: java.lang.NullPointerException
    	at io.vertx.ext.web.impl.Utils.readFileToString(Utils.java:153)
    	... 34 more

    Quelqu'un sait il comment fonctionne le path dans un projet Vert.x/Maven ?

  2. #2
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 325
    Points : 3 769
    Points
    3 769
    Billets dans le blog
    12
    Par défaut
    Salut,

    Je ne connais Vert.x que de nom, mais généralement avec Maven tu places les fichiers statiques internes au projet sous src/main/resources (voir même un dans dossier /META-INF sous /resources).
    Je te renvoie vers la documentation de Vert.x qui pourront peut-être t'aider : lien1, lien2.

    N'hésite pas à nous dire comment tu as résolu le problème

  3. #3
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 450
    Points
    19 450
    Par défaut
    Bonjour.

    Je cite ma réponse ici comme la question a été déplacée :

    Citation Envoyé par ok.Idriss Voir le message
    Je n'ai pas utilisé la partie Handlebars de vert.x web personnellement (je l'utilise que pour des micro-services et composants d'intégration).
    Toutefois, je vois pas à quel moment tu fait le rendering de ton template hbs avec la requête HTTP.

    Il y a un exemple de handler sur un router qui utilise la méthode render sur un fichier hbs ici : http://www.programcreek.com/java-api...TemplateEngine

    Tu peux peut être tenter de t'en inspirer. Ca m'étonnerait pas que dans ton cas la classe Utils de vert.x web pête un NPE parce que le nom du HBS est null car pas passé à la méthode render : piste à explorer.
    Je vais réviser ma réponse en ayant lu cette doc : http://vertx.io/docs/vertx-web/java/...g_hidden_files
    Dans l'exemple, le Router fait le lien entre les requêtes ayant ".hbs" en passant par le même TemplateHandler ce qui n'est pas le cas dans ton code.
    Je ne vois pas le lien entre les fichiers "hbs" et la requête "dynamic" dans ton code, contrairement à la doc ou ça passe par le même Handler (TemplateHandler).

    Dans ma réponse en citation, l'exemple va plus loin en gérant un handler spécifique par fichier hbs mais en passant par le même template engine.
    Je pense que cette solution marche aussi voire est préférable.

    Cordialement,
    Idriss

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2015
    Messages : 9
    Points : 11
    Points
    11
    Par défaut
    Je m'en suis sorti finalement

    Le nullPointerException ne venait pas du path du fichier .hbs mais plutôt de la variable de contexte vertx() qui était belle et bien null ...

    Ce qui c'est passé, initialement comme dans le tuto de thierryler j'ai utilisé un seul Verticle, puis je suis passé à plusieurs, et suite à çà je me suis permis de placer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    final Router router = Router.router(vertx);
    en variable de classe et non plus dans la méthode start() de ma classe HelloWorld qui extends de extends AbstractVerticle, ce qui ne fonctionne pas !!!

    Résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    package com.vertxtest.vertx_01;
     
    import io.vertx.core.AbstractVerticle;
    import io.vertx.core.Vertx;
    import io.vertx.core.VertxOptions;
    import io.vertx.ext.web.Router;
    import io.vertx.ext.web.handler.BodyHandler;
    import io.vertx.ext.web.templ.HandlebarsTemplateEngine;
    import io.vertx.ext.web.templ.TemplateEngine;
     
    public class HelloWorld extends AbstractVerticle {
     
        public static final String APPLICATION_JSON = "application/json";
     
        @Override
        public void start() throws Exception {
     
            VertxOptions options = new VertxOptions();
            options.setMaxEventLoopExecuteTime(100000);
            vertx = Vertx.vertx(options);
     
            final Router router = Router.router(vertx);
     
            // Enable multipart form data parsing
            router.route().handler(BodyHandler.create());
            // In order to use a template we first need to create an engine
            final TemplateEngine engine = HandlebarsTemplateEngine.create();
            // TemplateHandler handler = TemplateHandler.create(engine);
     
            router.get("/dynamic/").handler(ctx -> {
     
                // variable transmise au template et interpreté avec les balises
                // handleBars {{name}}
                    ctx.put("name", "Vert.x Web");
     
                    engine.render(ctx, "templates/test.hbs", res -> {
     
                        if (res.succeeded()) {
                            ctx.response().end(res.result());
                        } else {
                            ctx.fail(res.cause());
                        }
     
                    });
                });
     
            router.get("/hello/").handler(
                    req -> {
                        req.response().putHeader("content-type", "text/html")
                                .end("<html><body><h1>Hello World</h1></body></html>");
                        System.out.println(req.request().getParam("toto").trim());
                    });
     
            vertx.createHttpServer().requestHandler(router::accept).listen(8989, res -> {
                if (res.succeeded()) {
                    System.out.println("success: " + res.toString());
                } else {
                    System.out.println("failed : " + res.cause());
                }
            });
        }
    }
    Une fois le problème du nullPointer réglé, j'ai rajouter la partie manquante du engine.render comme vous me l'avez suggéré et hop çà fonctionne au top ^^
    Merci pour vos réponses d'ailleurs

    Pour infos : mes fichiers .hbs sont dans des sourceFolders (reference Eclipse) src/main/resources/templates/XXX.hbs

Discussions similaires

  1. Problème avec l'utilisation de LogMessage
    Par vanquish dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 17/11/2005, 11h18
  2. Problème avec l'utilisation d'un module
    Par goblin dans le forum Modules
    Réponses: 4
    Dernier message: 09/11/2005, 21h55
  3. Problème avec l'utilisation de librairies
    Par Aradesh dans le forum MFC
    Réponses: 3
    Dernier message: 01/08/2005, 16h00
  4. [debutant] problème avec type à utiliser
    Par mlequim dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 15/07/2005, 17h08
  5. Problème avec l'utilisation de la fonction clock
    Par Matgic95 dans le forum C++Builder
    Réponses: 13
    Dernier message: 09/05/2005, 20h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo