我遇到了這樣的問題:如何將物件從 Web 表單傳遞到 Spring 控制器?(我也在使用 Hibernate 和 Thymeleaf)
我所做的一切都像在這里完成的那樣: 使用 Thymeleaf 發布具有多對一關系的資料, 但這對我不起作用。我收到這樣的錯誤:
欄位“引擎”上的物件“汽車”中的欄位錯誤:拒絕值 [1];代碼 [typeMismatch.car.engine,typeMismatch.engine,typeMismatch.ua.klieshchunov.spring.memorial.model.entity.Engine,typeMismatch]; 引數 [org.springframework.context.support.DefaultMessageSourceResolvable: 代碼 [car.engine,engine]; 論據 []; 默認訊息[引擎]];默認訊息 [無法將型別“java.lang.String”的屬性值轉換為屬性“engine”所需的型別“ua.klieshchunov.spring.memorial.model.entity.Engine”;嵌套例外是 java.lang.IllegalStateException:無法將型別“java.lang.String”的值轉換為屬性“engine”所需的型別“ua.klieshchunov.spring.memorial.model.entity.Engine”:沒有匹配的編輯器或轉換找到的策略]
我明白這個錯誤是什么意思。它試圖將選定選項的值放入引擎型別的 Car 物件的欄位中。但我不明白,如何使它作業:P
這是與此問題相關的所有代碼
車
@Entity
@Table(name="cars")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Car {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="car_id")
private int id;
@Column(name="car_model")
@Size(min=1, max=50, message="Model should be between 1 and 50 characters")
private String model;
@Column(name="car_price")
@Min(value=0, message="The value must me positive")
private int price;
@ManyToOne(optional = false, cascade = CascadeType.ALL)
@JoinColumn(name="engine_id")
private Engine engine;
}
引擎
@Entity
@Table(name="engines")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Engine {
@Id
@Column(name="engine_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name="model")
@Size(min=1, max=50, message="Model should be between 1 and 50 characters")
private String model;
}
CarController(控制器)
@GetMapping("/new")
public String newCar(@ModelAttribute("car") Car car,
Model model) {
model.addAttribute("engines", engineDAO.retrieve());
return "/car/new";
}
@PostMapping("/save")
public String create(@Valid @ModelAttribute("car") Car car,
BindingResult bindingResult,
Model model) {
if (bindingResult.hasErrors()) {
for (ObjectError objectError : bindingResult.getAllErrors()) {
System.out.println(objectError);
}
model.addAttribute("engines", engineDAO.retrieve());
return "/car/new";
}
carDAO.create(car);
return "/car/index";
}
new.html(視圖)
...
<form th:method="POST" th:action="@{/car/save}" th:object="${car}">
...
<label for="engine">Choose engine: </label>
<select th:field="*{engine}" id="engine">
<option th:each="dropDownItem : ${engines}"
th:value="${dropDownItem.id}"
th:text="${dropDownItem.model}" >
</option>
</select>
<br/>
<input type="submit" value="Create">
</form>
...
uj5u.com熱心網友回復:
我需要做的就是在表單中將選擇塊的 th:field 值從“*{engine}”更改為“*{engine.id}”。
新的.html
...
<select th:field="*{engine.id}" id="engine">
<option th:each="dropDownItem : ${engines}"
th:value="${dropDownItem.id}"
th:text="${dropDownItem.model}" >
</option>
</select>
...
然后在控制器中找到所需的記錄(帶有所選ID的引擎)并將填充的引擎物件設定為我的Сar物件,我已經從表單中獲得了所有其他條目
汽車控制器
@PostMapping("/save")
public String create(@Valid @ModelAttribute("car") Car car,
BindingResult bindingResult,
Model model) {
if (bindingResult.hasErrors()) {
for (ObjectError objectError : bindingResult.getAllErrors()) {
System.out.println(objectError);
}
model.addAttribute("engines", engineDAO.retrieve());
return "/car/new";
}
car.setEngine(engineDAO.read(car.getEngine().getId()));
carDAO.create(car);
return "redirect:/car";
}
是的,晚上編碼并不是一個絕妙的主意 xD
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/456728.html
上一篇:使用復選框編輯用戶的角色
