Операция обновления не выполняется -решена [org.springframework.web.HttpRequestMethodNotSupportedException: метод запроса ‘POST’ не поддерживается]

#java #spring #hibernate #spring-mvc #spring-data-jpa

#java #весна #переход в спящий режим #spring-mvc #spring-data-jpa

Вопрос:

Я пытаюсь разработать приложение в spring boot thymeleaf, и я могу получить данные пользователя, вошедшего в систему, на вкладке профиля из базы данных MySQL, но когда я пытаюсь изменить данные одного или двух полей (обновить) и нажимаю кнопку обновления, появляется сообщение об ошибке — Пт Сен 04 20:39:47 IST 2020 Произошла неожиданная ошибка (тип = Метод не разрешен, статус = 405). Метод запроса ‘POST’ не поддерживается

смотрите мой код контроллера (я использую @RestController, аннотированный поверх класса)-

 @RequestMapping(value = "/profile", method = RequestMethod.PUT)
    public ModelAndView updateProfile(@ModelAttribute Customer customer, HttpSession session) {
        
        ModelAndView model = new ModelAndView();
        
        Customer exist = cRepo.findByCustEmail(customer.getCustEmail());

        if(exist != null) {
            if(exist.getCustEmail().equals(session.getAttribute("emailsession"))) {
                
                cRepo.save(customer);
                model.addObject("msg", "User Details has been successfully updated!!");
                model.setViewName("profile");
            }
                
        }else {
            
            model.addObject("exist", "Please enter correct email address!");
            String email = (String) session.getAttribute("emailsession");
            Customer cust = cRepo.findByCustEmail(email);
            model.addObject("customer", cust);
            model.setViewName("profile");
            
        }
        
        return model;
    }
  

Текстовый код (html) —

 <div align="center" class="alert alert-success" th:if="${msg}" th:utext="${msg}"></div>
<div align="center" class="alert alert-danger" th:if="${exist}" th:utext="${exist}"></div>

    <!-- Modal HTML -->
<div id="myModal">
    <div class="modal-dialog modal-login">
        <div class="modal-content">
            <div class="modal-header">              
                <h4 class="modal-title">Profile Details</h4>
            
            </div>
            <div class="modal-body">
                <form name="myForm" th:action="@{/profile}" th:object="${customer}" method="post">
                    
                    <div class="form-group">
                        <i class="fa fa-id-card"></i> 
                        <input name="id" type="text" class="form-control" placeholder="Enter Id" th:field="${customer.custId}" disabled="true" required="required" />
                    </div>
                    <div class="form-group">
                        <i class="fa fa-user"></i>
                        <input name="name" type="text" class="form-control" placeholder="Enter Name" th:field="${customer.custName}"  required="required" />
                    </div>
                    <div class="form-group">
                        <i class="fa fa-envelope"></i> 
                        <input name="email" type="email" class="form-control" placeholder="Enter Email" th:field="${customer.custEmail}" required="required" />
                    </div>
                    <div class="form-group">
                        <i class="fa fa-lock"></i>
                        <input name="password" type="text" class="form-control" placeholder="Enter Password" th:field="${customer.custPassword}" required="required" />                 
                    </div>
                    <div class="form-group">
                        <input type="submit" class="btn btn-primary btn-block btn-lg" value="Update" />
                    </div>
                </form>
            </div>
        </div>
    </div>
</div>     
  

Я хочу, чтобы при входе пользователя в систему и посещении он / она мог проверять свой профиль (что я могу сделать с рабочим кодом), и когда пользователь хочет обновить несколько полей (1-2 на основе выбора) и нажать обновить, он / она должен иметь возможность обновлять детали (не создавать нового пользователя или запись), потому что, когда я использую @Controller поверх класса, тогда этот код работает и создает нового пользователя вместо обновления.

Ответ №1:

Ваш контроллер помечен @RequestMapping(value = "/profile", method = RequestMethod.PUT) , что делает его конечной точкой PUT. Однако ваш запрос явно является POST. Если мы посмотрим на вашу HTML-форму, которую она содержит method="post" . HTML-формы поддерживают только GET и POST как допустимые методы, поэтому вам необходимо обновить свою конечную точку, чтобы она была конечной точкой POST.

tldr;

 RequestMapping(value = "/profile", method = RequestMethod.PUT)
  

Для

 RequestMapping(value = "/profile", method = RequestMethod.POST) 
  

Комментарии:

1. Когда я перешел на RequestMapping(значение = «/ profile», метод = RequestMethod. POST) это добавление новой записи (нового пользователя) в базу данных. Но я хочу обновить детали, потому что на вкладке профиля пользователь должен обновлять детали, а не добавлять новые. можете ли вы предложить сейчас?

2. Это не имеет ничего общего с вашим существующим вопросом, но обычно выполняется передача первичного ключа таблицы через конечную точку и использование его для определения, нужно ли вам выполнять вставку или обновление. Если первичный ключ не равен null, вы знаете, что это должно быть обновление, и наоборот

3. Мой вопрос касается как ошибки, так и запроса на обновление, потому что я выполняю обновление и имею надлежащий первичный ключ таблицы, установленный как not null, что означает, что первичный ключ уже присутствует в базе данных, поэтому его следует переопределить, а не создавать новый. можете ли вы предложить мне, пожалуйста? Я новичок и ищу помощи в этом.

4. не могли бы вы мне помочь, пожалуйста?

Ответ №2:

Вы запрашиваете сопоставление в is POST, но контроллер настроен на принятие запроса как PUT.

 <form name="myForm" th:action="@{/profile}" th:object="${customer}" **method="post"**>


@RequestMapping(value = "/profile", method = **RequestMethod.PUT**) 
  

Просто сохраните их аналогичным образом, оба должны быть одинаковыми.

Комментарии:

1. Я внес изменения, и теперь оба места, которые я написал, публикуются, но они добавляют данные в базу данных (новый пользователь), когда я пытаюсь обновить одно или два поля оттуда. Как я могу обновить вместо добавления нового?

2. не могли бы вы мне помочь, пожалуйста?

3. Для обновления — заменить — cRepo.save (клиент); С помощью — cRepo.save(существует);

4. @AjayKumar Спасибо, это работает, единственное, что нам нужно сделать, это установить значения перед сохранением информации.

5. Конечно, вы предоставите / измените некоторые данные для обновления.

Ответ №3:

Пожалуйста, проверьте, что я нахожу, и разрешите это.

 @RequestMapping(value = "/profile" ,method = RequestMethod.POST)
    public ModelAndView updateProfile(@ModelAttribute Customer customer, HttpSession session) {
        
        ModelAndView model = new ModelAndView();
        
        Customer exist = cRepo.findByCustEmail(customer.getCustEmail());

        if(exist != null) {
            if(exist.getCustEmail().equals(session.getAttribute("emailsession"))) {
                
                **exist.setCustId(exist.getCustId());
                exist.setCustName(customer.getCustName());
                exist.setCustEmail(customer.getCustEmail());
                exist.setCustPassword(customer.getCustPassword());**
                
                cRepo.save(exist);
                model.addObject("msg", "User Details has been successfully updated!!");
                
                model.addObject("customer", exist);
                model.setViewName("profile");
            }
                
        }else {
            
            model.addObject("exist", "Please enter correct email address!");
            String email = (String) session.getAttribute("emailsession");
            Customer cust = cRepo.findByCustEmail(email);
            model.addObject("customer", cust);
            model.setViewName("profile");
            
        }
        
        return model;
    }