为啥我的控制器中的保存功能不起作用?
Posted
技术标签:
【中文标题】为啥我的控制器中的保存功能不起作用?【英文标题】:Why the function save in my controller does not work?为什么我的控制器中的保存功能不起作用? 【发布时间】:2019-07-23 16:58:10 【问题描述】:我正在使用 springboot 和 thymeleaf 做一个简单的 crud,但是当我尝试使用 save 函数进行更新或创建时,我丢失了对象的数据。我单击新按钮并更新我正确打开模态,并使用已充电对象的数据,但是当我单击保存时,我丢失了对象。
我认为我的问题出在形式上,我不知道它是什么。我尝试使用邮递员,但点击保存或更新时没有收到请求
索引:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8"/>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
<script th:src="@js/main.js" src="../static/js/main.js"></script>
</body>
</head>
<body>
<div class="container">
<div class="jumbotron">
<h1>Paginación con SpringBoot</h1>
</div>
<button class="btn btn-success nBtn">New</button>
<div class="card">
<div class="card-block">
<table class="table table-hover">
<thead>
<tr>
<th>ID</th>
<th>COUNTRY</th>
<th>CAPITAL</th>
<th>ACTION</th>
</tr>
</thead>
<tbody>
<tr th:each="country :$data.content">
<td th:text="$country.id"></td>
<td th:text="$country.name"></td>
<td th:text="$country.capital"></td>
<td>
<a th:href="@/delete/(id=$country.id)" class="btn btn-danger dBtn">Delete</a>
<a th:href="@/findOne/(id=$country.id)" class="btn btn-primary eBtn">Edit</a>
</td>
</tr>
</tbody>
</table>
<hr>
</div>
<div>
<ul class="nav nav-pills nav-justified">
<li class="nav-item" th:each="i :$#numbers.sequence(0,data.totalPages-1)">
<a th:href="@/(page=$i)" th:text="$i" class="nav-link" th:classappend="$currentPage==$i?'active':''"></a>
</li>
</ul>
</div>
</div>
<div class="myForm">
<form th:action="@/save" th:object="$country" method="post">
<div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Update or Create</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<div class="form-group">
<label for="id" class="col-form-label">Id:</label>
<input type="text" class="form-control" id="id" name="id" th:value="*''" disabled/>
</div>
<div class="form-group">
<label for="name" class="col-form-label">Name:</label>
<input type="text" class="form-control" id="name" name="name" th:value="*''"/>
</div>
<div class="form-group">
<label for="capital" class="col-form-label">Capital:</label>
<input type="text" class="form-control" id="capital" name="capital" th:value="*''"/>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
<input type="submit" class="btn btn-primary" data-dismiss="modal" value="Save"/>
</div>
</div>
</div>
</div>
</form>
</div>
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Modal title</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<p class="alert alert-danger">Are you sure you want to delete this?</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
<a href="" class="btn btn-danger" id="delRef">Delete</a>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
控制器:
@Controller
public class CountryController
@Autowired
private CountryRepository countryRepository;
@SuppressWarnings("deprecation")
@GetMapping("/")
public String showPage(Model model, @RequestParam(defaultValue="0") int page)
model.addAttribute("data", countryRepository.findAll(new PageRequest(page,4)));
model.addAttribute("currentPage", page);
return "index";
@PostMapping("/save")
public String save(Country country)
countryRepository.save(country);
return "redirect:/";
@GetMapping("/delete")
public String deleteCountry(Integer id)
countryRepository.deleteById(id);;
return "redirect:/";
@GetMapping("/findOne")
@ResponseBody
public Optional<Country> FindOne(Integer id)
return countryRepository.findById(id);
js:
$(document).ready(function()
$('.nBtn, .table .eBtn').on('click', function(event)
event.preventDefault();
var href = $(this).attr('href');
var text = $(this).text();
if(text=='Edit')
$.get(href,function(country,status)
$('.myForm #id').val(country.id);
$('.myForm #name').val(country.name);
$('.myForm #capital').val(country.capital);
);
$('.myForm #exampleModal').modal();
else
$('.myForm #id').val('');
$('.myForm #name').val('');
$('.myForm #capital').val('');
$('.myForm #exampleModal').modal();
);
$('.table .dBtn').on('click', function(event)
event.preventDefault();
var href = $(this).attr('href');
$('#myModal #delRef').attr('href',href);
$('#myModal').modal();
););
类:
@Entity
public class Country
@Id
@GeneratedValue
private Integer id;
private String name;
private String capital;
public Country(String name, String capital)
this.name = name;
this.capital = capital;
public Country()
@Override
public String toString()
return "Country [id=" + id + ", name=" + name + ", capital=" + capital + "]";
public Integer getId()
return id;
public void setId(Integer id)
this.id = id;
public String getName()
return name;
public void setName(String name)
this.name = name;
public String getCapital()
return capital;
public void setCapital(String capital)
this.capital = capital;
存储库:
public interface CountryRepository extends JpaRepository<Country,Integer>
【问题讨论】:
【参考方案1】:可能在保存方法上缺少@RequestBody 注解
@PostMapping("/save")
public String save(@RequestBody Country country)
countryRepository.save(country);
return "redirect:/";
【讨论】:
嗨,谢谢,但我尝试使用它,我继续没有回答。我不明白该程序会为我保存数据。 发布请求头和正文,或者卷曲 我不太明白你需要什么。我已经发布了带有动作和方法的表单,它发送到控制器,我应该在其中存储数据,它是一个小应用程序。 三个文件齐全 别发帖了,我觉得我都很好【参考方案2】: @RequestBody 如前所述。 提供您的国家/地区代码 CountryRepository 的代码是什么? 如果你在你的控制器保存方法中设置一个断点,你是真的得到国家数据还是它是空的?顺便说一句,您不应该从控制器访问您的存储库,因为没有事务管理。
【讨论】:
我的问题是表单不发布请求,我不知道为什么【参考方案3】:使用@RequestBody
和repository.saveAndFlush(entity)
通过使用@RequestBody
注释,您将获得与您在系统中创建的模型映射的值,以处理任何特定调用
在saveAndFlush
上,更改将在此命令中刷新到DB immediately
。使用保存时,这不一定是真的,并且可能只保留在内存中,直到发出刷新或提交命令。
@PostMapping("/save")
public String save(@RequestBody Country country)
countryRepository.saveAndFlush(country);
return "redirect:/";
【讨论】:
【参考方案4】:@mantamusica如果你还有兴趣,我有一个解决方案给你。
@Jason Portnoy@Patel Romil
在这种情况下,添加注释
@RequestBody
返回错误代码 415。
这个问题的解决方案在于 HTML 端,或者更确切地说是 Bootstrap。
删除
data-dismiss="modal"
来自输入
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
<input type="submit" class="btn btn-primary" data-dismiss="modal" value="save"/>
</div>
...它对我有用:)
【讨论】:
以上是关于为啥我的控制器中的保存功能不起作用?的主要内容,如果未能解决你的问题,请参考以下文章