Spring, JavaFX, интернационализация и модульность - PullRequest
0 голосов
/ 03 декабря 2018

Связанные: https://www.javacodegeeks.com/2013/03/javafx-2-with-spring.html и Как обрабатывать несколько файлов и сообщений для интернационализации в Spring?

У меня есть приложение, которое смешивает пружинуи JavaFX вместе, следуя методу, указанному в первой ссылке.

В начале у меня был всего один файл il8n для всего, однако со временем все растет, и теперь пришло время разделить этот файл.Все приложение уже разделено на модуль.Последнее, что нужно сделать, - это разбить этот глобальный файл.

В настоящее время все просто: я использую статический класс, содержащий ссылку на правильный пакет:

private static ApplicationContext SPRING_CONTEXT;
private static ObjectProperty<ResourceBundle> resourceBundleWrapper;

public JavaFxLoader(ApplicationContext context, 
    ObjectProperty<ResourceBundle> resourceBundle){
    SPRING_CONTEXT = context;
    resourceBundleWrapper = resourceBundle;
}

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

Предположим:

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

Так что в основном весь мой конкретный элемент управления выглядит следующим образом:

public class MyCustomControl extends Control {
    private static final java.net.URL FXML_PATH = JavaFxLoader.makeFXMLPath(MyCustomControl .class,
            "my-custom-control.fxml");
    ...

    public MyCustomControl () {


    }

    @Override
    protected Skin<?> createDefaultSkin() {
        return new DefaultSkin();
    }

    private class DefaultSkin extends VBox implements Skin<MyCustomControl> {
        public DefaultSkin(MyCustomControl control) {
            MyCustomControlController controller = JavaFxLoader.loadFXML(this,
                    MyCustomControlController .class, FXML_PATH);
           //post-intialisation of controller by giving the reference to the control
            controller.initData(control);
        }

        @Override
        public MyCustomControl getSkinnable() {
            return control;
        }

        @Override
        public Node getNode() {
            return this;
        }

        @Override
        public void dispose() {
            // TODO Auto-generated method stub
        }
    }
}

Обратите внимание, что иногда мне нужно самому создать объект Control, поэтому я буду создавать его непосредственновместо того, чтобы FXMLLoader делал это для меня.

Проблема с моим текущим кодом заключается в методе loadFXML:

public static <T> T loadFXML(Object owner, Class<T> controllerClass, URL fxmlPath){
    FXMLLoader fxmlLoader = new FXMLLoader();
    fxmlLoader.setResources(resourceBundleWrapper.get());
    fxmlLoader.setController(SPRING_CONTEXT.getBean(controllerClass));
    fxmlLoader.setLocation(fxmlPath);
    fxmlLoader.setRoot(owner);
    try {
        fxmlLoader.load();
        return fxmlLoader.<T>getController();
    } catch (IOException exception) {
        throw new RuntimeException(exception);
    }
}

В настоящее время существуетя не могу указать конкретный пакет.

Итак, мой вопрос: какой будет правильный способ сделать это?

  • Настройте карту пакета и пакета ресурсов и выполнитенекоторая волшебная отражательная способность, основанная на имени контроллера пакета, чтобы угадать, какой пакет я должен использовать.Я бы предпочел этого избегать.
  • Статически хранить каждый экземпляр ресурса пакета в классе для каждого модуля и добавлять новый параметр в функцию loadFXML: экземпляр MessageSource.У меня уже есть статическая ссылка на общую утилиту JavaFXLoader, я не уверен, стоит ли добавлять другие необработанные статические ссылки.
  • Найдите способ получить все необходимые пакеты и собрать их все в один пакет для всех.Ради этого мы будем предполагать, что каждый ключ уникален для всех MessageSource / RessourceBundle.

Я бы предпочел последний способ сделать это, однако для этого мне потребуется:

  • В каждом модуле определите строку, указывающую на его связки
  • В классе конфигурации основного модуля всего приложения найдите способ собрать все эти строки вместе и создать один MessageSource для всех.

Конфигурация загружена:

  • С нетерпением, нет отложенной загрузки компонентов (некоторые внутренние компоненты имеют отложенную загрузку своих данных)
  • Использование аннотацийтолько.Даже в Контроллере меня не волнует связь между пружиной и моим контроллером.Однако я не вставляю springContext в myController, зависимость заключается только в аннотации @ Autowired / @ Qualifier.
  • Нет Spring-Boot, только Spring-Context.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...