假设我有课程:
abstract class Animal {}
class Elephant extends Animal {
Trunk trunk;
RightEar rightEar;
}
class Peacock extends Animal {
Tail tail;
Beak beak;
}
我想编写单控制器方法,它将具有Animal
类型的参数:
@RequestMapping("/animal")
public ModelAndView animalsHandler(@ModelAttribute("animal") Animal animal) {...}
通过在propertyEditor
方法中选择适当的@InitBinder
,我发现对于非复杂参数could be done,即它只会以不同的方式转换输入字符串。
但是如果Elephant
和Peacock
里面还有其他一些对象呢?在这种情况下,我似乎无法为他们写propertyEditor
,但只针对他们的Trunk
,Tail
和Beak
?我完全糊涂了。
答案 0 :(得分:1)
请求映射器能够创建要使用请求参数填充的正确实例,这一点非常重要。完成此操作后,beanwrapper将能够使用默认行为处理属性。所以你需要能够为动物模式创建一个孔雀实例,你应该没问题。
这就是我如何做到的:(我这样做是为了解决实体)
在启动时扫描实体并创建一个包含simpleclassname和类的地图的组件
创建一个StringToEntityConverter,使用上面的组件解析字符串并将其注册到ConversionService(SimpleClassName_Identifier)
发送请求参数,如下所示:SimpleClassName_Identifier
如果这样做得好,如果请求参数是实体并转换它,转换器将启动。
由于o已经为具有所有公共基类和整数作为id的实体执行了此操作,因此扫描非常简单。转换器获取字符串,拆分它并使用entitymanager获取实体(如果id不为null)或者如果id为null则创建新实例。 从这一点开始,所有请求映射都可以直接将实体实例作为请求参数。
simpleclassname在这里工作,因为所有jpa实体都需要一个唯一的简单名称!
如果您不希望具有类映射的组件,您也可以发送完整的类名。如果您只需要新实例,转换器只需要类名而不需要其他任何内容。