为啥我的控制器中的保存功能不起作用?

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">&times;</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">&times;</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】:

使用@RequestBodyrepository.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>

...它对我有用:)

【讨论】:

以上是关于为啥我的控制器中的保存功能不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥控制忙指示灯不起作用

为啥我的保存方法在管理员中不起作用?

为啥我在 codeigniter 中的分页不起作用? (404 未找到)

为啥我的 UICollectionView 大纲不起作用?

为啥我的打印功能不起作用?链表

为啥我的属性路由不起作用?