Java Spring MVC抽象类绑定
假设我有课程:Java Spring MVC抽象类绑定,java,spring,spring-mvc,propertyeditor,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 ani
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
发现,对于非复杂参数,它只会以不同的方式转换输入字符串
但是如果
大象
和孔雀
里面还有其他东西呢?在这种情况下,我似乎无法为它们编写属性编辑器,但只能为它们的躯干
,尾部
和喙
?。。我完全搞糊涂了。重要的是,requestmapper能够创建正确的实例来填充requestparameters。完成后,BeanRapper将能够使用默认行为处理属性。因此,您需要能够为animal modelattribute创建一个peacock实例,这样就可以了
我就是这样做的:(我这样做是为了解析实体)
- 启动时,扫描实体并创建包含simpleclassname和class映射的组件
- 创建一个使用上述组件解析字符串的StringToEntityConverter,并将其注册到ConversionService(SimpleClassName\u标识符)
- 发送如下请求参数:SimpleClassName\u标识符
如果这样做正确,如果requestparameter是一个实体,那么转换器将启动并转换它
因为o已经为所有具有公共基类和整数作为id的实体完成了这项工作,所以扫描非常简单。转换器获取字符串,将其拆分,如果id不为null,则使用entitymanager获取实体;如果id为null,则创建新实例。
从这一点开始,所有RequestMapping都可以直接将实体实例作为requestparameters
simpleclassname在这里工作,因为所有jpa实体都需要一个唯一的简单名称
如果不希望组件具有名称到类的映射,也可以发送完整的类名。如果您只需要新实例,那么转换器只需要类名,而不需要其他任何东西 重要的是,requestmapper能够创建正确的实例来填充requestparameters。完成后,BeanRapper将能够使用默认行为处理属性。因此,您需要能够为animal modelattribute创建一个peacock实例,这样就可以了
我就是这样做的:(我这样做是为了解析实体)
- 启动时,扫描实体并创建包含simpleclassname和class映射的组件
- 创建一个使用上述组件解析字符串的StringToEntityConverter,并将其注册到ConversionService(SimpleClassName\u标识符)
- 发送如下请求参数:SimpleClassName\u标识符
如果这样做正确,如果requestparameter是一个实体,那么转换器将启动并转换它
因为o已经为所有具有公共基类和整数作为id的实体完成了这项工作,所以扫描非常简单。转换器获取字符串,将其拆分,如果id不为null,则使用entitymanager获取实体;如果id为null,则创建新实例。
从这一点开始,所有RequestMapping都可以直接将实体实例作为requestparameters
simpleclassname在这里工作,因为所有jpa实体都需要一个唯一的简单名称
如果不希望组件具有名称到类的映射,也可以发送完整的类名。如果您只需要新实例,那么转换器只需要类名,而不需要其他任何东西 谢谢你的回答!我尝试按照您的指示为我的实体编写了特殊的转换器,并在conversionService
中注册了它。但当我发送请求时,有一个BeanInstantiationException
,它问我“它是抽象类吗?”。因此,我必须编写HandlerMethodArgumentResolver
的自定义实现,在这里我选择一个合适的子类,然后使用WebRequestDataBinder
手动绑定所有字段。感谢您的回答!我尝试按照您的指示为我的实体编写了特殊的转换器,并在conversionService
中注册了它。但当我发送请求时,有一个BeanInstantiationException
,它问我“它是抽象类吗?”。因此,我必须编写HandlerMethodArgumentResolver
的自定义实现,在其中选择适当的子类,然后使用WebRequestDataBinder
手动绑定所有字段。