Разрешение параметров / преобразователь для динамически зарегистрированных команд
Я работаю над CLI Spring Shell 2 и пытаюсь генерировать команды во время выполнения из определенного интерфейса посредством отражения.
Обновление: реализация интерфейса также генерируется во время выполнения.
Я использую ConfigurableCommandRegistry и MethodTarget для регистрации моей команды.
Есть ли способ настроить / зарегистрировать конвертеры во время выполнения для параметров метода, который передается в MethodTarget?
Каков наилучший подход для этого?
Я довольно новичок в Java и 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 имя age (или более параметров)
Короче говоря, я хотел бы создать преобразователи для параметров, которые являются сложными объектами и сплющить их.
Вложенные объекты игнорируются
1 ответ
Любой боб, который является Converter<String, Person>
должен работать и подхватываться Spring Shell автоматически. Посмотрите на ConversionExample в примерах.
При этом, почему вы говорите, что хотите зарегистрировать все динамически? Spring Shell предназначен для получения кода с аннотациями (например, например, @ShellMethod
). Хотя должна быть возможность динамически выполнять работу, которую выполняют стандартные регистраторы при просмотре этих аннотаций, из ваших примеров видно, что вы можете аннотировать свой код с помощью @ShellMethod
уже? Так почему бы не позволить Spring Shell сделать для вас открытие и регистрацию?
Другими словами: почему вы аннотируете интерфейс, а не метод реализации? Если бы вы сделали это, вам бы не пришлось иметь дело с MethodTarget
и т.д., все это делается автоматически для вас Spring Shell.
Надеюсь, это проясняет ситуацию и оказывается самым простым решением