Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring MVC抽象类绑定_Java_Spring_Spring Mvc_Propertyeditor - Fatal编程技术网

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
手动绑定所有字段。