Spring MVC抽象类绑定

时间:2013-05-16 22:30:02

标签: java spring spring-mvc propertyeditor

假设我有课程:

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,即它只会以不同的方式转换输入字符串。

但是如果ElephantPeacock里面还有其他一些对象呢?在这种情况下,我似乎无法为他们写propertyEditor,但只针对他们的TrunkTailBeak?我完全糊涂了。

1 个答案:

答案 0 :(得分:1)

请求映射器能够创建要使用请求参数填充的正确实例,这一点非常重要。完成此操作后,beanwrapper将能够使用默认行为处理属性。所以你需要能够为动物模式创建一个孔雀实例,你应该没问题。

这就是我如何做到的:(我这样做是为了解决实体)

  • 在启动时扫描实体并创建一个包含simpleclassname和类的地图的组件

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

  • 发送请求参数,如下所示:SimpleClassName_Identifier

如果这样做得好,如果请求参数是实体并转换它,转换器将启动。

由于o已经为具有所有公共基类和整数作为id的实体执行了此操作,因此扫描非常简单。转换器获取字符串,拆分它并使用entitymanager获取实体(如果id不为null)或者如果id为null则创建新实例。 从这一点开始,所有请求映射都可以直接将实体实例作为请求参数。

simpleclassname在这里工作,因为所有jpa实体都需要一个唯一的简单名称!

如果您不希望具有类映射的组件,您也可以发送完整的类名。如果您只需要新实例,转换器只需要类名而不需要其他任何内容。