【发布时间】:2017-03-25 18:12:32
【问题描述】:
我有一个这样的模型:
@Entity
public class DayMenuItem {
@Id @GeneratedValue(strategy= GenerationType.IDENTITY)
private Long id;
private MonetaryAmount price;
private Product product;
private String name;
@ManyToOne(targetEntity = DayMenu.class)
private DayMenu dayMenu;
...
}
使用 getter 和 setter。我有 DayMenu 模型,它也有一个 id 属性。
我创建了一个 DayMenuItem 类的新实例,设置了相应的 dayMenu 属性并将其传递给视图。在视图中,用户可以设置其他属性,如价格或名称。 我现在想通过在隐藏的输入字段中传递 dayMenu 属性到下一个控制器。我的 thymeleaf 视图表单如下所示:
<form th:acction="@{/admin/addMenuItem}" th:object="${menuitem}" method="post">
<p>Name: </p><input type="text" th:field="*{name}"/>
<p>Price: </p><input type="text" th:field="*{price}"/>
<button>Ok</button>
<input type="hidden" th:field="${menuitem.dayMenu}" th:value="${menuitem.getDayMenu()}"/>
</form>
JPA(?) 选择(正确的)DayMenu Id 作为隐藏输入的值。但是当我尝试将模型重新放入控制器时,它不再接受 Id 值。
我的控制器头是这样的:
@RequestMapping(value = "/admin/addMenuItem", method = RequestMethod.POST)
public ModelAndView addMenuItemPost(@Valid @ModelAttribute("menuitem") DayMenuItem dayMenuItem,
BindingResult bindingResultDayMenuItem,
ModelAndView modelAndView) { ...
当我查看 BindingResult 时,我看到了这个错误,并且 dayMenu 属性为空。 (1 是 DayMenu id)
org.springframework.validation.BeanPropertyBindingResult: 1 个错误 字段“dayMenu”上的对象“menuitem”中的字段错误:拒绝值 [1];代码 [typeMismatch.menuitem.dayMenu,typeMismatch.dayMenu,typeMismatch.winetavern.model.menu.DayMenu,typeMismatch];参数 [org.springframework.context.support.DefaultMessageSourceResolvable:代码 [menuitem.dayMenu,dayMenu];论据 [];默认消息 [dayMenu]];默认消息 [无法将类型 [java.lang.String] 的属性值转换为属性“dayMenu”所需的类型 [winetavern.model.menu.DayMenu];嵌套异常是 org.springframework.core.convert.ConversionFailedException:无法从类型 [java.lang.String] 转换为类型 [@javax.persistence.ManyToOne winetavern.model.menu.DayMenu] 以获取值 '1';嵌套异常是 java.lang.ClassCastException: java.lang.Long 不能转换为 org.salespointframework.core.SalespointIdentifier]
为什么 JPA 不再接受 ID 作为对象的标识符并抛出异常,尽管它曾经进行过从对象到 ID 值的转换?
提前致谢!
【问题讨论】: