请求方法 'GET' 不支持] 使用@DeleteMapping 的方法出错

Request method 'GET' not supported] error for method using @DeleteMapping

我收到如下错误:

Request method 'GET' not supported for a method (deleteProductById)

每当我访问映射到所述方法 (http://localhost:8083/deleteproductbyid/1) 的 URL 时使用 @DeleteMapping 注释。当我将方法的注释更改为 @GetMapping 时,该应用程序可以正常工作,但这会导致其他问题。

相关代码如下:

package com.democrudexample.controller;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
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.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.democrudexample.model.Product;
import com.democrudexample.services.CrudService;

@RestController
@RequestMapping("/")
public class CrudRestController {

    @Autowired
    private CrudService service;
    
    @GetMapping("/getproductlist")
    @CrossOrigin(origins = "http://localhost:4200")
    public List<Product> fetchProductList() {
        List<Product> products = new ArrayList<Product>();
        //logic to fetch list from database
        products = service.fetchProductList();
        return products;
    }
    
    @PostMapping("/addproduct")
    @CrossOrigin(origins = "http://localhost:4200")
    public Product saveProduct(@RequestBody Product product) {
        return service.saveProductToDB(product);
    }
    
    @GetMapping("/getproductbyid/{id}")
    @CrossOrigin(origins = "http://localhost:4200")
    public Product fetchProductById(@PathVariable int id) {
        return service.fetchProductById(id).get();
        
    }
    
    @DeleteMapping(value = "/deleteproductbyid/{id}")
    @CrossOrigin(origins = "http://localhost:4200")
    public String deleteProductById(@PathVariable int id) {
        return service.deleteProductById(id);
    }
}
package com.democrudexample.services;

import java.util.List;
import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.democrudexample.model.Product;
import com.democrudexample.repository.CrudRepo;

@Service
public class CrudService {

    @Autowired
    private CrudRepo repo;
    
    public List<Product> fetchProductList(){
        return repo.findAll();
    }
    
    public Product saveProductToDB(Product product) {
        return repo.save(product);
    }
    
    public Optional<Product> fetchProductById(int id) {
        
        return repo.findById(id);
    }
    
    public String deleteProductById(int id) {
        String result;
        try {
            repo.deleteById(id);
            result = "Product sucessfully deleted";
            System.out.println(result);
        }catch(Exception e) {
            result = "Product id is not valid";
            System.out.println(result);
        }
        
        return result;
    }
}

编辑:我在 deleteProductById 方法中注释掉了结果和与之相关的所有内容,现在它似乎工作得很好。查看控制台后,错误似乎是解析文本的一些问题。

通过将方法注释为@DeleteMapping,您将其设为 HTTP DELETE 操作。有关不同 HTTP 请求的更多详细信息,请参阅此 documentation

但是,当您在浏览器中访问 URL 时,浏览器总是发送 GET 请求,而您的资源期待 DELETE 请求。因此你得到了错误。

您可以使用 Postman 之类的工具,或者您可以在 Javascript 中编写一小段代码来向服务器发送 DELETE 请求。