#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;
}