Spring Boot 上 H2 数据库的 HTTP 删除

Posted

技术标签:

【中文标题】Spring Boot 上 H2 数据库的 HTTP 删除【英文标题】:HTTP Delete for H2 Database on Spring Boot 【发布时间】:2020-01-20 06:16:15 【问题描述】:

我正在学习 Spring Boot,刚开始看 H2-Database。我设法发送了一个 HTTP GET 请求以在我的数据库中插入一个新行,但我无法删除它。

这就是我插入新行的方式:

@GetMapping("/addAlien")
public String addAlien(Alien alien) 
  rep.save(alien);
  return "home.jsp";

这是我用来发送 GET 请求的 JSP 代码:

<form action="addAlien">
  <input type="text" name="id"><br>
  <input type="text" name="name"><br>
  <input type="text" name="points"><br>
  <input type="submit"><br>
</form>

这是我用来填充 H2 数据库的 SQL 文件

insert into alien values (101, 'Bilu', 100)
insert into alien values (102, 'Vargínia', 100)
insert into alien values (103, 'Meeseek', 100)
insert into alien values (104, 'Jack', 100)
insert into alien values (105, 'MrPopButthole', 100)

我有另一个表单,就像我用来发送 GET 请求的表单一样,但要提交“/deleteAlien”。并且提交激活了下面的代码,虽然不起作用:

@DeleteMapping("/deleteAlien")
public int deleteAlien(@RequestParam int id) 
  rep.deleteById(id);
  ModelAndView mv = new ModelAndView("showAlien.jsp");
  Alien alien = rep.findById(id).orElse(null);          
  mv.addObject(alien);
  return id;

提交后我在这里收到此错误:

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.

Thu Sep 19 06:12:27 BRT 2019
There was an unexpected error (type=Method Not Allowed, status=405).
Request method 'GET' not supported
org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'GET' not supported...

我要做的是通过表单指定一个“int id”,然后删除具有相同id的行。


解决方案:我设法使用 Postman 发送正确的 HTTP 请求来解决问题。它有效,但如果有人指导我使用 jsp.file 和表单进行操作,我将不胜感激。

这是有效的代码:

@DeleteMapping("/alien/id")
public String deleteAlien(@PathVariable("id") int id) 
  Alien a = rep.getOne(id);
  rep.delete(a);
  return "deleted";

我只需要打开 Postman 并将其配置为使用 localhost:8080/alien/id 发送 DELETE。

【问题讨论】:

仅供参考,而不是使用屏幕截图,将这些示例嵌入问题中。顺便说一句,您的错误表明您没有对@DeleteMapping("/deleteAlien") 使用正确的请求方法,它需要DELETE,而不是GET 欢迎来到 Stack Overflow!请不要发布您的代码的图像。有several reasons不鼓励这样做。 对图片真的很抱歉。 【参考方案1】:

您正在发送 HTTP GET 请求以删除该项目,而您的控制器说映射是 DELETE,因此您需要将 HTTP 请求更改为 DELETE 而不是 GET

【讨论】:

我想过。但是“DeleteMapping”不是这样做的吗?我认为它下面的所有内容都是 HTTP DELETE。 DeleteMapping 表示这个url只支持HTTP请求DELETE方法,所以当请求带有不同的方法时,会抛出HttpRequestMethodNotSupportedException 哦!我认为 DeleteMapping 负责更改 HTTP 请求。 GetMapping 时是 HTTP GET,DeleteMapping 时是 HTTP DELETE。谢谢!【参考方案2】:

@DeleteMapping 之前的代码中是否有“`”?

`@DeleteMapping("/deleteAlien")

检查here和here

【讨论】:

put method="DELETE" 在你的jsp上,我已经编辑了我的答案,请检查 刚试过。还是不行。我设法通过邮递员删除。我将编辑帖子以显示解决方案,但我想通过表单:'( 你的jsp不能删除,请看我的回答,我已经更新了【参考方案3】:

默认 HTTP 方法是 GET,因此您使用 GET HTTP 方法向服务器请求

使用 GET HTTP 方法请求您必须使用 DELETE HTTP 方法请求

这样做

创建另一个带有表单的 jsp 文件以删除该 jsp 文件中的条目 使用 method="DELETE" 和 action="deleteAlien" 写入表单标签

<form action="deleteAlien" method="DELETE">

[input tags]

</form>

【讨论】:

我照你说的做了,但还是不行:/我设法通过邮递员删除了。我将编辑帖子以显示解决方案,但我想通过表单:'( 在您的代码中,您使用了 @DeleteMapping("/alien/id") 因此您的操作 URL 必须类似于 action="alien/id" 这里 id 必须是您要删除的条目的 id 假设您要删除 id=1 的条目,因此您的操作 URL 必须类似于 action="alien/1" 现在采取某种方式在您的操作 URL 中插入 id 如果您输入要手动删除的条目 id,那么您必须使用 javascript 在您的操作 url 中添加 id,如果您知道 jsp 文件的 id 加载时间以进行删除,您可以将其注入简单的 jsp 代码 action="alien/" 这里 id 是一个变量,其中包含要删除的条目的 id 以了解更多信息 在 fb 上用我的名字找到我并 ping 我

以上是关于Spring Boot 上 H2 数据库的 HTTP 删除的主要内容,如果未能解决你的问题,请参考以下文章

您可以在 Autoconfigured Spring Boot H2 测试数据库上设置兼容模式吗?

Flyway 与 Spring Boot 的集成不会在嵌入式 H2 数据库上执行迁移脚本

使用 h2 和 spring boot 进行测试

在 Spring Boot 应用程序上使用 Flyway 时如何在 H2 中加载初始数据?

内存数据库spring-boot中的h2

spring-boot 文件系统中的持久 h2 数据库