Произошла неожиданная ошибка (тип=Метод Не разрешен, статус=405). Метод запроса «GET» не поддерживается, но я использую putmapping

#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