将对象从web窗体传递到Spring控制器时出现问题



我遇到了这样的问题:如何将对象从web窗体传递到Spring控制器?(我也在使用Hibernate和Thymelaf(

我做的一切都像这里做的那样: 使用Thymelaf 发布多对一关系的数据,但这对我不起作用。我收到这样的错误:

字段"engine"上对象"car"中的字段错误:拒绝值[1];codes[typeMismatch.car.engine,typeMismatch.engine,typeMismatch.ua.klieshchunov.spring.memorial.model.entity.engine,typeMismitch];arguments[org.springframework.context.support.DefaultMessageSourceResolvable:codes[car.engine,engine];论点[];默认消息[引擎]];默认消息[无法将类型为"java.lang.String"的属性值转换为属性"Engine"所需的类型"ua.klieshchunov.spring.memorial.model.entity.Engine";嵌套异常为java.lang.IllegalStateException:无法将类型"java.lang.Tring"的值转换为所需的属性"Engine'"的类型"ua.kliesh丘nov.springe.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;
}

车载控制器(控制器(

@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>
...

我所需要做的就是将select块的th:field值从"{engine}">"*{engine.id}">形式。

new.html

...
<select th:field="*{engine.id}" id="engine">

<option th:each="dropDownItem : ${engines}"
th:value="${dropDownItem.id}"
th:text="${dropDownItem.model}" >
</option>
</select>
...

之后,在控制器中,我在db(具有所选id的引擎(中找到所需的记录,并将填充的engine对象设置为我的С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";
}

Ye,晚上编码并不是一个好主意xD

最新更新