#java #spring-boot
Вопрос:
Я работаю над полнотекстовым приложением, которое содержит пользователя, продукт, аддон (начинки) и многое другое.
Однако, когда я пытаюсь запустить localhost:8080/Администратор/пользователи/Шон (пример), предполагается, что он продвигает пользователя. Однако вместо этого он просто выдает мне вышеуказанную ошибку. «Не поддерживайте». Это происходит, несмотря на то, что я использую putmapping, а не getmapping. Ниже приведен код.
AdminController.java
package com.example.pizza_order_service.controllers;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.example.pizza_order_service.model.Addon;
import com.example.pizza_order_service.model.Product;
import com.example.pizza_order_service.model.User;
import com.example.pizza_order_service.service.AddonService;
import com.example.pizza_order_service.service.ProductService;
import com.example.pizza_order_service.service.UserService;
@Controller
@RequestMapping("/Admin")
public class AdminController {
@Autowired
private ProductService prodService;
@Autowired
private UserService userService;
@Autowired
private AddonService addonService;
@GetMapping("")
public ModelAndView listProducts() {
List<Product> products = prodService.findAll();
return new ModelAndView("product","Product", products);
}
@GetMapping("/")
public ModelAndView listAddons() {
List<Addon> addons = addonService.findAll();
return new ModelAndView("product","Addon", addons);
}
@GetMapping("/Product")
public String displayProducts(ModelMap model) {
Iterable<Product> results = prodService.findAll();
model.addAttribute("product", results);
return "product";
}
@GetMapping("/Toppings")
public String displayToppings(ModelMap model) {
Iterable<Addon> results = addonService.findAll();
model.addAttribute("toppings", results);
return "Addon";
}
// - Promote Users
@PutMapping("/users/{id}")
public String promoteUser(User newUser){
User user = userService.findUserByUserName(newUser.getName());
user.setRole(newUser.getRole());
return "Promotion confirmed";
}
//- Delete Product
@DeleteMapping(value="/deleteProd/{id}")
public ModelAndView deleteAProduct(@PathVariable("id") long id) {
prodService.deleteProduct(id);
return listProducts();
}
//- Delete Toppings
@DeleteMapping(value="/deleteAddon/{id}")
public ModelAndView deleteAnAddon(@PathVariable("id") long id) {
addonService.deleteAddon(id);
return listAddons();
}
}
users.html
<!-- HTML -->
<html id="content">
<head>
<div th:replace="fragment.html :: header"></div>
<!-- CSS -->
<style>
td {
padding: 10px;
}
</style>
<!-- End CSS -->
</head>
<body class="background" style="overflow: hidden;">
<!-- Navbar -->
<div th:replace="fragment.html :: navbar"></div>
<!-- Menu -->
<br><br><br><br><br><br><br>
<table class="xy-center" style="position: fixed; background-color: var(--tertiary); color: var(--primary); font-size: 3.5vh; border-radius: 15px; padding: 5px;">
<b th:utext="${user}"></b>
</table>
<!-- End Menu -->
<p>
<br>
<br>
<br><br><br><br><br><br>
Hello World!</p>
</body>
<!-- JS -->
<script>
// To open the navbar buttons
$(document).ready(function() {
$('.first-button').on('click', function () {
$('.animated-icon1').toggleClass('open');
});
});
</script>
<!-- End JS -->
</html>
Если потребуется больше кода, пожалуйста, дайте мне знать, это довольно большое приложение. Спасибо.
Правка: Кстати, я получаю ту же ошибку, когда пытаюсь также вызвать удаление приложений.
Комментарии:
1. Что вы подразумеваете под «Я пытаюсь запустить localhost:8080/Администратор/пользователи/Шон»?
2. Вот что я набрал в браузере в ответ на первый комментарий
3. Тогда вам следует вместо этого запустить a
curl -X PUT
. При вводе URL-адреса в вашем браузереGET
по умолчанию запускается метод. Вы можете отредактировать метод наNetwork
вкладке инспектора, щелкнуть правой кнопкой мыши и отредактировать запрос. Тем не менее, я рекомендую использоватьcurl
или любые другие инструменты тестирования (Почтальон, если вы предпочитаете графический интерфейс).
Ответ №1:
Браузеры не запускают команды PUT, если вы просто вводите адрес в качестве URL-адреса. Вам нужно будет использовать HTTP-клиент, такой как cURL или Postman
Комментарии:
1. Я вижу, то же самое относится и к удалению приложений?
2. Конечно, ваш веб-браузер является HTTP-клиентом, но для запуска других методов , кроме
GET
этого, ему необходимо получить специальные инструкции: использовать определенныйform
method
атрибут with (см. developer.mozilla.org/en-US/docs/Web/HTML/Element/Form ).3. Когда я пробую это в postman, я просто перенаправляюсь на другую страницу, хотя я добавил URL-адрес в WebSecurityConfig (надеюсь, правильно).
4. Было бы неплохо
curl
, если бы кто-нибудь помог вам. Вам лучше открыть новую проблему, так как эта проблема решена.5. @Vincent Методы HTML-формы не поддерживают put (или delete), хотя
Ответ №2:
Я верю, что вы должны постараться /api/v1/
, чтобы на вашем пути появился смысл localhost:8080/Admin/users/Sean
localhost:8080/api/v1/Admin/users/Sean
. Не могли бы вы, пожалуйста, попробовать это ?
Комментарии:
1. Это не меняет метод HTTP и в значительной степени зависит от свойств spring, если требуется путь
2. Что заставляет вас полагать, что существует
/api/v1/
контекстный путь с учетом предоставленной информации?3. Я попытался добавить это на страницу WebSecurityConfig, но я все равно получаю перенаправление при вводе приведенного вами примера в браузер
Ответ №3:
На ваш запрос не будет получен ответ
@PutMapping("/users/{id}")
как его только примут, ставит.
Вам нужна другая конечная точка для возврата html-страницы (через запрос браузера GET), например
@GetMapping("/users/{id}")
public ModelAndView showUserPage(User user){
return new ModelAndView("users","User", user);
}
Комментарии:
1. Основываясь на вопросе, они на самом деле хотят запустить PUT