繁体   English   中英

Spring MVC抽象类绑定

[英]Spring MVC abstract class binding

假设我有课:

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) {...}

我发现对于非复杂参数, 可以通过在@InitBinder方法中选择适当的propertyEditor 来完成 ,即它将仅以不同方式转换输入字符串。

但是,如果ElephantPeacock里面还有其他物体怎么办? 在这种情况下,我似乎无法为他们编写propertyEditor ,而只能为他们的TrunkTailBeak ?..编写。我完全感到困惑。

重要的是,请求映射器能够创建正确的实例,以用request参数填充。 完成此操作后,beanwrapper将能够使用默认行为处理属性。 因此,您需要能够为动物模型属性创建孔雀实例,并且应该可以。

这就是我这样做的方式:(我这样做是为了解决实体)

  • 在启动时扫描实体,并创建一个包含simpleclassname和class映射的组件

  • 使用上述组件创建一个解决字符串的StringToEntityConverter并将其注册到ConversionService(SimpleClassName_Identifier)

  • 发送这样的请求参数:SimpleClassName_Identifier

如果正确完成此操作,则当requestparameter是实体时,转换器将启动并进行转换。

因为o已经对所有具有通用基类和一个整数作为id的实体执行了此操作,所以扫描非常简单。 如果id不为null,则转换器将字符串取为字符串,将其拆分并使用entitymanager来获取实体;如果id为null,则创建新实例。 从这一点开始,所有requestmapping都可以直接将实体实例作为requestparameters。

simpleclassname在这里起作用是因为所有jpa实体无论如何都需要一个唯一的简单名称!

如果您不希望该组件具有名称到类的映射,也可以发送完整的类名。 如果只需要新实例,则转换器只需要类名即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM