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 в любом случае нуждаются в уникальном простом имени!

Если вы не хотите, чтобы компонент с именем сопоставлялся с классом, вы также можете отправить полное имя класса. И если вам нужны только новые экземпляры, преобразователю просто нужно имя класса без чего-либо еще.

Другие вопросы по тегам