请求方法 '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 请求。
我收到如下错误:
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 请求。