假设我有一个抽象类A,该类在我的MainClass中,然后我有这个类B和C的实现。使用ModelAndAttribute我在某些场景中渲染MainClass与B和其他MainClass与C实现。两者在控制器中都有相同的提交方法,所以当我在表单中请求这个ModelAndAttribute时,我正在等待MainClass与之前呈现的B或C实现,但是Spring是它一直认为是A“NullValueInNestedPathException,Invalid property,嵌套属性的值为null“。
知道Spring是否有机制来确定接收哪个实现类?
我已经阅读了这篇http://www.cowtowncoder.com/blog/archives/2010/03/entry_372.html并且看起来很有希望,但我无法互动,或者我不想与杰克逊就如何序列化实体进行互动。
问候。
答案 0 :(得分:1)
Spring不会决定实例化哪个实现。 您将不得不添加一些代码来决定需要启动哪两个类
我们有类似的要求 我们在请求参数
中传递类型ClassB或ClassC我们有方法
@ModelAttribute (value = "mainClass")
public void populateObjectBasedOnRequestParameter (
ModelMap modelMap, HttpServletRequest request)
此方法基本上读取请求参数并使用正确的A类实现实例化mainClass
表格提交
@RequestMapping (value = "/{workItemId}", method = RequestMethod.POST, params = "save", consumes = MediaType.ALL_VALUE)
public String commit(
@ModelAttribute ("mainClass")MainClass mainClass,
BindingResult result, Principal principal,
HttpServletRequest request, final ModelMap model) {
使用请求参数
提交表单时populateObjectBasedOnRequestParameter()执行此方法,以便在执行commit()方法时,模型映射具有A类的启动实现