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

Spring Boot Java Discussion :

NullPointer dans une servlet


Sujet :

Spring Boot Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2016
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Août 2016
    Messages : 31
    Points : 29
    Points
    29
    Par défaut NullPointer dans une servlet
    Bonjour à tous,
    Je suis en train de créer des serveurs en micro-services spring boot.
    Jusque là, rien à dire, les WS sont ok et tout va bien.

    Par contre, ces serveurs doivent également fournir quelques interfaces permettant d'uploader des fichiers et de paramétrer certains downloads (par exemple).
    Et là, un sérieux problème se pose à moi.
    J'utilise des servlets pour faire ceci et tout va bien tant que ces dernières n'affichent que des exemples mais quand je leur demande d'afficher des choses dynamiques, à savoir le résultat issue des BDD, tout va mal.
    Je reçois un NullPointerException dès que j'appel mon service.

    J'ai bien cherché sur le net et je trouve des solutions mais aucune ne semble marcher. Il doit y avoir quelque chose qui m'a échappé mais je ne trouve pas quoi.

    A l'aide!!!!


    Voici mon code (je restreint les classes au strict nécessaire) :

    -la classe general
    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
     
    @EnableJpaRepositories("xxx.yyy.zzz")
    @ComponentScan(basePackages = {"xxx.yyy.zzz"})
    @EntityScan("xxx.yyy.zzz.entitys")
    @SpringBootApplication
    public class general extends SpringBootServletInitializer {
     
        public static void main(String[] args) throws Exception {
            SpringApplication.run(general.class, args);
        }
     
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
            return application.sources(general.class);
        }
     
        @Bean
        public ServletRegistrationBean TheBeanServlet() {
            ServletRegistrationBean bean = new ServletRegistrationBean(new TheBeanServlet(), "/TheBeanServlet");
            bean.setLoadOnStartup(1);
            return bean;
        }
    }
    -le service (trop grand donc en partie) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    @Service
    @Transactional
    public class PatchService {
        public List<PatchInstalleDto> getPatchsInstalled() {
            List<PatchInstalleDto> patchs = getListePatchs();
            return patchs;
        }
     
        public List<PatchInstalleDto> getListePatchs() {
            ...
        }
    }
    -la servlet :
    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
     
    public class TheBeanServlet extends HttpServlet {
     
        @Autowired
        private PatchService patchService;
     
        @Override
        public void init() {
            SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
        }
     
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            processRequest(request, response);
        }
     
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            processRequest(request, response);
        }
     
        protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setAttribute("patchs", patchService.getPatchsInstalled());
            String patchName = request.getParameter("patch");
            if (patchName != null) {
                request.setAttribute("patchDetails", patchService.getDetailsPatch(patchName));
            }
            this.getServletContext().getRequestDispatcher("/theBeanServlet.jsp").forward(request, response);
        }
     
        protected String getContextParameter(String name) {
            return getServletContext().getInitParameter(name);
        }
    }
    Voici également l'erreur que j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    java.lang.NullPointerException: null
    	at com.cegedim.clm.live.patchs.servlet.CrosswayPatchInfoServlet.processRequest(TheBeanServlet.java:33) ~[classes/:na]
    	at com.cegedim.clm.live.patchs.servlet.CrosswayPatchInfoServlet.doGet(CrosswayPatchInfoServlet.java:24) ~[classes/:na]
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:622) ~[tomcat-embed-core-8.5.11.jar:8.5.11]
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) ~[tomcat-embed-core-8.5.11.jar:8.5.11]
    La ligne en cause est le premier appel au service, à savoir :
    request.setAttribute("patchs", patchService.getPatchsInstalled());

    Après un debug, je me suis aperçu que c'est patchService qui est null.

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    461
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 461
    Points : 894
    Points
    894
    Billets dans le blog
    5
    Par défaut
    Déjà une remarque générale: on applique les conventions Java.

    C'est General et non general (nom de la classe).

    Bon, là, la réponse est simple: PatchService n'est pas injecté dans la Servlet.

    Pour commencer, je suis d'accord au moins sur un point: Derrière tous framework Web (JSF, Spring MVC, Struts, une JSP...) il y a une servlet.

    Dans ton cas, je pense qu'il y a 3 solutions potentielle. Je te laisse faire des recherches pour la suite:
    1) Injecter via l'annotation @PostConstruct. C'est la solution, ici, que jaime le moins.
    2) Utiliser le context Spring (que l'on peut retrouver, mais je ne sais plus comment) et rechercher le bean dedans.
    3) Ne pas utiliser de servlet, mais un service Rest via Spring MVC et configuré via SpringBoot.

    Selon le principe d'inversion de contrôle, et vu que ton application est construite autour de Spring, je recommande fortement la 3ème solution.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2016
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Août 2016
    Messages : 31
    Points : 29
    Points
    29
    Par défaut
    Bonjour PhilippeGibault et merci pour ta réponse.
    En fait, j'avais effectivement trouvé la solution il y a quelques jours et j'avais bien sur oublié de la mettre sur ce post .

    Pour le nom de la classe, je suis bien les conventions Java mais du fait de l'application que je suis en train de faire, j'ai du changer les noms des classes. C'est juste une erreur de renommage rapide en lançant ce SOS.

    Pour le servlet, effectivement j'avais également identifié le problème d'injection et je me doutais que les servlets étaient hors de la "zone" gérée par Spring-boot.
    Du coup, je m'en passe et j'utilise un controller et les GetMapping/PostMapping.
    En plus, c'est bien plus simple pour moi car je n'ai strictement rien à adapter dans la jsp (je récupère les jsp existantes d'une ancienne appli).

    En final, Spring c'est bien et les servlets c'est le mal. ^^

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    461
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 461
    Points : 894
    Points
    894
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Jbwils Voir le message
    Bonjour PhilippeGibault et merci pour ta réponse.


    En final, Spring c'est bien et les servlets c'est le mal. ^^
    Je ne peux pas laisser dire ça, et ceci pour deux raisons.

    La première est que derrière le traitement Spring, il y a ... une servlet.
    La Servlet est la base du traitement Web Java et tous frameworks web Java est basée, un moment ou un autre, sur une servlet.
    C'est le cas de JSF, Struts ou Spring MVC.
    Par ailleurs, je pense que l'on se doit, si on est développeur Java, avoir fait une fois dans sa vie, l'exercice de la Servlet Delannoy.

    De plus, lorsque l'on écrit une JSP, on génère une servlet derrière.

    Le seconde raison, c'est qu'une fois, j'avais un projet simple (en réalité, c'était une partie d'un projet sur un projet complexe qui avait une Énorme dette technique).

    On m'a imposé d'utilisé Spring au détriment d'une simple Servlet. Pour un projet qui faisait peu de chose (téléchargement d'un fichier).
    Ça m'a fait mal au cœur, car dans un projet qui a de la dette technique, on a rajouté de la dette technique dans le sens ou l'on a utilisé un Marteau-piqueur là où un marteau aurait suffit.

    C'est un Anti-pattern qui a un nom: Le Marteau Doré.

    Donc Spring est très bien, c'est un très bon framework mais pour des projets plus simples, plus petit et avec très peu de fonctionnalité, Spring peut être trop lourd, voir contre productif.

    Je ne peux donc pas laisser passer cette phrase. La réponse est ça dépend du projet, du context, des besoins...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [applet]utilser des infos pour les traiter dans une servlet
    Par jeromejanson dans le forum Applets
    Réponses: 5
    Dernier message: 07/03/2010, 23h22
  2. [Struts] Element de formulaire dans une servlet
    Par Adrien09 dans le forum Struts 1
    Réponses: 4
    Dernier message: 17/03/2006, 15h14
  3. Réponses: 2
    Dernier message: 15/02/2006, 17h35
  4. [webservices] heberger un webservices dans une servlet ?
    Par n!co dans le forum Services Web
    Réponses: 14
    Dernier message: 07/12/2005, 14h44
  5. [Session]Récupération d'une session dans une servlet
    Par frizby dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 18/11/2005, 17h02

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