1

假设我有课:

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方法来完成,即它只会通过不同的方式转换输入字符串。

但是如果Elephant里面Peacock有一些其他的物体呢?在那种情况下,似乎我不能propertyEditor为他们写 s ,而只能为他们的Trunk,TailBeak?.. 我完全糊涂了。

4

1 回答 1

1

重要的是 requestmapper 能够创建正确的实例来填充请求参数。完成此操作后,beanwrapper 将能够处理具有默认行为的属性。所以你需要能够为动物模型属性创建一个孔雀实例,你应该没问题。

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

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

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

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

如果正确完成,如果请求参数是实体,转换器将启动并转换它。

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

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

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

于 2013-05-17T07:29:54.663 回答