Spring MVC привязка абстрактного класса
Предположим, у меня есть классы:
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
для них в этом случае, но только для их Trunk
, Tail
а также Beak
?.. Я полностью сбит с толку.
1 ответ
Важно, чтобы запросчик мог создать правильный экземпляр, который будет заполнен параметрами запроса. Как только это будет сделано, beanwrapper сможет обрабатывать атрибуты с поведением по умолчанию. Таким образом, вы должны иметь возможность создать экземпляр павлина для атрибута модели животного, и у вас все должно быть в порядке.
Вот как я это сделал: (Я сделал это, чтобы решить сущности)
при запуске проверять сущности и создавать компонент, содержащий карту simpleclassname и класса
создайте StringToEntityConverter, разрешающий строку, используя вышеуказанный компонент, и зарегистрируйте ее в ConversionService (SimpleClassName_Identifier)
отправьте параметр запроса следующим образом: SimpleClassName_Identifier
Если это сделано правильно, конвертер сработает, если параметр запроса является сущностью, и преобразует его.
Поскольку это было сделано для сущностей, которые имеют общий базовый класс и целое число как id, сканирование было довольно простым. Преобразователь берет строку, разделяет ее и использует диспетчер управления данными для извлечения объекта, если идентификатор не равен нулю, или создает новый экземпляр, если идентификатор был равен нулю. С этого момента все сопоставления запросов могут напрямую иметь экземпляры сущностей в качестве параметров запроса.
Простое имя класса работает здесь, потому что все сущности jpa в любом случае нуждаются в уникальном простом имени!
Если вы не хотите, чтобы компонент с именем сопоставлялся с классом, вы также можете отправить полное имя класса. И если вам нужны только новые экземпляры, преобразователю просто нужно имя класса без чего-либо еще.