Преобразование параметров /преобразователь для динамически регистрируемых команд

Я работаю над интерфейсом командной строки Spring Shell 2 и пытаюсь генерировать команды во время выполнения из определенного интерфейса посредством отражения.
Обновление: реализация интерфейса также создается во время выполнения.
Я использую ConfigurableCommandRegistry и MethodTarget для регистрации своей команды.
Есть ли способ настроить/зарегистрировать преобразователи? во время выполнения для параметров метода, который передается в MethodTarget?
Как лучше всего это сделать?

Я новичок в java и spring, и я не уверен, что это вообще возможно. Имейте это в виду и, пожалуйста, не убивайте меня :)
The Extending Spring Shell документации отсутствует (неполная?)
Я уже проверил Проект Spring shell, но не смог найти что-то для работы.
Может быть, это возможно с помощью разрешения параметров? или создание преобразователей во время выполнения с помощью FormatterRegistrar?

Регистрация команд следующим образом

MethodTarget command = new MethodTarget(method, client, new Command.Help(description, group), availabilityIndicator);
registry.register(commandName, command);

метод и параметры метода, клиент, описание, группа извлекаются через отражение из интерфейса.

Я хотел бы сгенерировать команду во время выполнения из интерфейса


public interface MessagingManagement {
  @ShellMethod(...)
  public void createPerson(@ShellOption(...)Person person);
}

который вызывается со следующими параметрами create-person --person name age (или больше параметров)

Короче говоря, я хотел бы создать преобразователи для параметров, которые являются сложными объектами, и сгладить их.
Вложенные объекты игнорируются.


person Crossbone    schedule 20.01.2019    source источник


Ответы (1)


Любой bean-компонент, который является Converter<String, Person>, должен работать и автоматически подхватываться Spring Shell. Взгляните на ConversionExample в примерах.

При этом, почему вы говорите, что хотите регистрировать все динамически? Spring Shell предназначен для сбора кода, аннотированного специальными аннотациями (например, @ShellMethod). Хотя должна быть возможность динамически выполнять работу, которую выполняют стандартные регистраторы при просмотре этих аннотаций, из ваших примеров кажется, что вы уже согласны с аннотированием своего кода с помощью @ShellMethod? Так почему бы не позволить Spring Shell выполнить поиск и регистрацию за вас?

Другими словами: почему вы аннотируете интерфейс, а не метод реализации? Если бы вы это сделали, вам не пришлось бы иметь дело с MethodTarget и т. д., Spring Shell сделает все это автоматически за вас.

Надеюсь, это прояснит ситуацию и окажется самым простым решением.

person ebottard    schedule 21.01.2019
comment
Спасибо за ответы. На самом деле реализация сервиса генерируется во время выполнения. Я забыл упомянуть эту важную информацию в своем первоначальном вопросе, простите! - person Crossbone; 22.01.2019
comment
Как он генерируется? Может ли сгенерированная реализация содержать аннотации Spring Shell (вместо интерфейса)? - person ebottard; 23.01.2019
comment
Когда преобразователь, например. Преобразователь‹String, Person› используется, например. public class Person { private String name; private String addresse; private int age; } Я теряю подробную информацию о pojo, включая доступные параметры, их тип, являются ли они обязательными или нет, и т. д. Другими словами. Когда я использую конвертер, можно ли передавать отдельные параметры по имени, например: add-person --name foo --address bar --age 42 или мне нужно вводить параметры человека, например. as json add-person {name:foo, address:bar, age:42} Без какой-либо помощи при вводе отдельных параметров pojo? - person Crossbone; 01.02.2019