Partage
  • Partager sur Facebook
  • Partager sur Twitter

Spring boot Thymeleaf problème de controleur

    4 mai 2022 à 4:09:32

    Bonjour,
    j'essaye de faire une application web qui utilise:
    SpringBoot
    Mysql
    JDBC
    Design pattern: MVC, DAO
    Thymeleaf
    Et IntelliJ
    Mais je rencontre un problème avec la redirection des contrôleurs vers les vues:
    index.html:
    <!DOCTYPE html>
    <html xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>Welcome</title>
    </head>
    <body>
    <h1>Welcome to Spring Boot</h1>
    <a th:href="@{/login}">Login</a>
    </body>
    </html>

    LoginController (le controleur):

    package com.example.MyTFE.controllers;
    
    import com.example.MyTFE.model.DAO.DiabeticDAO;
    import com.example.MyTFE.model.bean.LoginForm;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.ModelAttribute;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    
    public class LoginController {
        //to get login form page
        @RequestMapping(value="login", method= RequestMethod.GET)
        public String getLoginForm(){
            //return html page name
            return "loginPage";
        }
    
        //checking for login credentials
        @RequestMapping(value="login", method= RequestMethod.POST)
        public String login(@ModelAttribute (name="loginForm")LoginForm loginForm, Model model) {
            String mail= loginForm.getMail();
            String mdp = loginForm.getMdp();
    
            DiabeticDAO dia = new DiabeticDAO();
            if(dia.loggin(mail,mdp))
            {
                return "home";
            }
            else
            {
                return "firstPage";
            }
        }
    }
    loginPage.html (une des vues qui renvoi le message d'erreur précédent):
    <!DOCTYPE html>
    <html xmlns:th="http://www.thymeleaf.org" lang="en">
    <head>
        <meta charset="UTF-8">
        <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
        <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>
        <title>Title</title>
    </head>
    <body>
    <form action="#" th:action="@{/login}" th:object="${loginForm}" method="post">
        <div class="mb-3 mt-3">
            <label for="email" class="form-label">Email:</label>
            <input type="email" class="form-control" id="email" placeholder="Enter email" name="email" autofocus="autofocus">
        </div>
        <div class="mb-3">
            <label for="mdp" class="form-label">Password:</label>
            <input type="password" class="form-control" id="mdp" placeholder="Enter password" name="mdp">
        </div>
    
        <button type="submit" value = "Log In" class="btn btn-primary">Submit</button>
    </form>
    </body>
    </html>



    -
    Edité par JackG90 4 mai 2022 à 4:11:29

    • Partager sur Facebook
    • Partager sur Twitter
      4 mai 2022 à 13:56:02

      bonjour,

      tu obtiens cette erreur parce que tu ne spécifies pas que la classe LoginController est un controller.Le controller doit être annoté avec @Controller

      @Controller
      public class LoginController {
      
      }



      • Partager sur Facebook
      • Partager sur Twitter
        4 mai 2022 à 15:10:25

        armel.mc a écrit:

        bonjour,

        tu obtiens cette erreur parce que tu ne spécifies pas que la classe LoginController est un controller.Le controller doit être annoté avec @Controller

        @Controller
        public class LoginController {
        
        }

        Merci pour ton aide cela semble avoir resolu une partie des problemes j'ai toujours ce message d'ereur sur d'autre en plus du message suivant qui semble venir de mon DAO, mais je n'arrive pas a trouver pourquoi :"this.jdbcTemplate" est null

        :

        "java.lang.NullPointerException: Cannot invoke "org.springframework.jdbc.core.JdbcTemplate.query(String, org.springframework.jdbc.core.RowMapper)" because "this.jdbcTemplate" is null

        at com.example.MyTFE.model.DAO.DiabeticDAO.getAllDiab(DiabeticDAO.java:33) ~[classes/:na]

        at com.example.MyTFE.model.DAO.DiabeticDAO.loggin(DiabeticDAO.java:39) ~[classes/:na]

        at com.example.MyTFE.controllers.LoginController.login(LoginController.java:27) ~[classes/:na]

        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]

        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78) ~[na:na]

        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]

        at java.base/java.lang.reflect.Method.invoke(Method.java:567) ~[na:na]

        at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.19.jar:5.3.19]

        ...

        -
        Edité par JackG90 4 mai 2022 à 15:33:21

        • Partager sur Facebook
        • Partager sur Twitter
          4 mai 2022 à 16:21:37

          au niveau de la classe DiabeticDao, la propriété jdbcTemplate n'est jamais instanciée du coup elle pointe à null. Avec Spring en lieu et place d'instancier toi même un objet tu peux laisser à spring le faire à ta place avec l'annotation @Autowired

          @Autowired
           private JdbcTemplate jdbcTemplate;


          https://spring.io/guides/gs/relational-data-access/

          • Partager sur Facebook
          • Partager sur Twitter
            4 mai 2022 à 16:58:36

            armel.mc a écrit:

            au niveau de la classe DiabeticDao, la propriété jdbcTemplate n'est jamais instanciée du coup elle pointe à null. Avec Spring en lieu et place d'instancier toi même un objet tu peux laisser à spring le faire à ta place avec l'annotation @Autowired

            @Autowired
             private JdbcTemplate jdbcTemplate;


            https://spring.io/guides/gs/relational-data-access/

            Encore merci pour ton aide mais cela ne semble pas résoudre complètement le problème car si maintenant cette methode semble fonctionner:

            public Diabetic getDiabById(int id){
                    return jdbcTemplate.queryForObject("select * from Diabetic where id_diabetic=?", new DiabeticRowMapper(),id);
                }

            La suivante renvoie toujours une erreur indiquant que "this.jdbcTemplate" est null ainsiq ue le message d'erreur suivant:

            Cannot invoke "org.springframework.jdbc.core.JdbcTemplate.query(String, org.springframework.jdbc.core.RowMapper)" because "this.jdbcTemplate" is null

            at com.example.MyTFE.model.DAO.DiabeticDAO.getAllDiab(DiabeticDAO.java:35) ~[classes/:na]

            at com.example.MyTFE.model.DAO.DiabeticDAO.loggin(DiabeticDAO.java:41) ~[classes/:na]

            at com.example.MyTFE.controllers.LoginController.login(LoginController.java:28) ~[classes/:na]

            at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]

            at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78) ~[na:na]

            at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]

            at java.base/java.lang.reflect.Method.invoke(Method.java:567) ~[na:na]

            at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.19.jar:5.3.19]

            at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.19.jar:5.3.19]

            at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.19.jar:5.3.19]

            at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.19.jar:5.3.19]

            at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.19.jar:5.3.19]

            at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.19.jar:5.3.19]

            at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067) ~[spring-webmvc-5.3.19.jar:5.3.19]

            at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) ~[spring-webmvc-5.3.19.jar:5.3.19]

            at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.19.jar:5.3.19]

            at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.19.jar:5.3.19]

            DiabeticDAO.java (nouvelle version)

            @Repository
            public class DiabeticDAO {
            
                @Autowired
                private JdbcTemplate jdbcTemplate;
            
                private SimpleJdbcInsert simpleJdbcInsert;
            
                @Autowired
                public void setDataSource(DataSource dataSource){
                    this.jdbcTemplate = new JdbcTemplate(dataSource);
                    this.simpleJdbcInsert = new SimpleJdbcInsert(dataSource).withTableName("diabetic")
                            .usingGeneratedKeyColumns("id_diabetic");
                }
            
                public Diabetic getDiabById(int id){
                    return jdbcTemplate.queryForObject("select * from Diabetic where id_diabetic=?", new DiabeticRowMapper(),id);
                }
            
                public List<Diabetic> getAllDiab(){
                    return jdbcTemplate.query("select * from Diabetic",new DiabeticRowMapper());
            
                }
                public boolean loggin(String mail, String mdp)
                {
                    DiabeticDAO diaDao = new DiabeticDAO();
                    List<Diabetic> listDia = diaDao.getAllDiab();
                    for (int i = 0; i < listDia.size(); i++)
                    {
                        if((listDia.get(i).getMail().equals(mail))&&(listDia.get(i).getPassword().equals(mdp)))
                        {
                            return true;
                        }
                    }
                    return  false;
                }
            
                private final class DiabeticRowMapper implements RowMapper<Diabetic> {
                    @Override
                    public Diabetic mapRow(ResultSet rs, int rowNum) throws SQLException{
                        Diabetic diabetic = new Diabetic();
                        diabetic.setId_diabetic(rs.getInt("id_diabetic"));
                        diabetic.setName(rs.getString("name"));
                        diabetic.setFirstname(rs.getString("firstname"));
                        diabetic.setBirthdate(rs.getDate("birthdate"));
                        diabetic.setMail(rs.getString("mail"));
                        diabetic.setPassword(rs.getString("password"));
                        diabetic.setPhone(rs.getString("phone"));
                        diabetic.setEmergencyContact(rs.getString("emergencyContact"));
                        diabetic.setAddress(rs.getString("address"));
                        return diabetic;
                    }
            
                }
            }





            -
            Edité par JackG90 4 mai 2022 à 16:59:07

            • Partager sur Facebook
            • Partager sur Twitter
              4 mai 2022 à 18:44:18

              si tu as une classe avec des annotations(@repository, @Service ...) tu n'as pas à créer une nouvelle instance.

              @Controller
              public class LoginController {
              	
              	@Autowired
              	private DiabeticDAO dia ; //avec @Autoriwired, spring crée automatiquement une nouvelle instance de DiabeticAO
              	 
                  //to get login form page
                  @RequestMapping(value="login", method= RequestMethod.GET)
                  public String getLoginForm(){
                      //return html page name
                      return "loginPage";
                  }
               
                  //checking for login credentials
                  @RequestMapping(value="login", method= RequestMethod.POST)
                  public String login(@ModelAttribute (name="loginForm")LoginForm loginForm, Model model) {
                      String mail= loginForm.getMail();
                      String mdp = loginForm.getMdp();
               
                     
                      if(dia.loggin(mail,mdp))
                      {
                          return "home";
                      }
                      else
                      {
                          return "firstPage";
                      }
                  }
              }

              tu peux supprimer éventuellement l'annotation @Autowire sur jdbcTemplate de la classe DiabeticDAO car elle est déjà instanciée dans le setDatasource

              @Repository
              public class DiabeticDAO {
               
              
                  private JdbcTemplate jdbcTemplate;
              
              }

              -
              Edité par armel.mc 4 mai 2022 à 18:49:52

              • Partager sur Facebook
              • Partager sur Twitter

              Spring boot Thymeleaf problème de controleur

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              • Editeur
              • Markdown