weixin_47204581 2021-03-23 20:23 采纳率: 87.5%
浏览 46
已采纳

Crudrepository如何通过接受html表单数据进行update?

@GetMapping("/update/{id}")
	public String updateEvent(@PathVariable("id") long id, Model model) {
		Event event = eventService.findOne(id);
		model.addAttribute("events",event);
		model.addAttribute("venues", venueService.findAll());
		return "events/update";
	}
	
//	@GetMapping("update")
	public String UUUpdateEvent(@RequestBody @Valid @ModelAttribute Event event, BindingResult errors,
			Model model, RedirectAttributes redirectAttrs) {
		if (errors.hasErrors()) {
			return "events/update";
		}
// change the parameter in .safe() to update
		eventService.save(event);
		redirectAttrs.addFlashAttribute("ok_message", "Event updated.");
		return "redirect:/events";
	}

这是我控制器的代码,通过id搜索到需要更新的那个event并把它放到model里,我的想法是这样在接收html表单发送过来的events变量需要的各项数据后可以直接用.save(event)来更新这个已存在的event,但结果却是新建了一个event,原来的那个完全不变,请问我是哪里写错了吗?

我在findOne之后试过直接通过event.set()更改数值并用.save(event)来更新,这样的更新方式是可行的,但我需要html的表单内容来进行更新。

附update.html:

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org" 
	  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
  	  layout:decorate="~{layouts/default}">
<head>
  <title>Update</title>
</head>
<body>
  <div layout:fragment="content">
    <h1>Update a existing event</h1>
    <form action="#" th:action="@{/events}" th:object="${event}" method="post">
<!--    
      <div class="form-group" th:classappend="${#fields.hasErrors('event')}? has-error">
         <label>Select the Event</label>
         <select th:field="${event}" class="form-control" required>
           <option th:each="e : ${events}" th:value="${e.id}" th:text="${e.name}"></option>
         </select>
         <p class="text-danger" th:if="${#fields.hasErrors('event')}" th:errors="*{event}">errors</p>
      </div>
-->
      <div class="form-group" th:classappend="${#fields.hasErrors('name')}? has-error">
        <label for="name">Rename event</label>
        <input class="form-control" type="text" name="name" id="name" autofocus="autofocus" required/>
        <p class="text-danger" th:if="${#fields.hasErrors('name')}" th:errors="*{name}">errors</p>
      </div>
       
      <div class="form-group" th:classappend="${#fields.hasErrors('date')}? has-error">
        <label for="date">New date of event</label>
        <input class="form-control" type="date" name="date" id="date" autofocus="autofocus" required/>
        <p class="text-danger" th:if="${#fields.hasErrors('date')}" th:errors="*{date}">errors</p>
      </div>
      
       <div class="form-group" th:classappend="${#fields.hasErrors('time')}? has-error">
        <label for="time">New time of event</label>
        <input class="form-control" type="time" name="time" id="time" autofocus="autofocus" required/>
        <p class="text-danger" th:if="${#fields.hasErrors('time')}" th:errors="*{time}">errors</p>
      </div>
      
       <div class="form-group" th:classappend="${#fields.hasErrors('description')}? has-error">
        <label for="description">Description of event</label>
        <textarea class="form-control" name="description" id="description"/></textarea>
        <p class="text-danger" th:if="${#fields.hasErrors('description')}" th:errors="*{description}">errors</p>
      </div>
      
      <div class="form-group" th:classappend="${#fields.hasErrors('venue')}? has-error">
         <label>Event Venue</label>
         <select th:field="${event.venue}" class="form-control" required>
           <option th:each="v : ${venues}" th:value="${v.id}" th:text="${v.name}"></option>
         </select>
         <p class="text-danger" th:if="${#fields.hasErrors('venue')}" th:errors="*{venue}">errors</p>
      </div>
   
      <button class="btn btn-primary" type="submit"><i class="fas fa-bookmark" aria-hidden="true"></i> Save</button>
      <a class="btn btn-warning" role="button" href="/events"><i class="fas fa-ban" aria-hidden="true"></i> Cancel</a>
    </form>
  </div>
</body>
</html>
  • 写回答

1条回答 默认 最新

  • BCS-点心 2021-03-24 08:58
    关注

    看了下,你的UUUpdateEvent这个方法,接收一个Event event参数来使用,那如果你在调用这个方法的时候没有传递一个Event,就会给你创建一个新的了,不然你下面的使用就会有空指针的可能了,这是框架帮你做的。

    如果你想用已经存在的Event,你就把它传参给UUUpdateEvent这个方法。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?