Гриффон "конструктор ошибок при внедрении" при попытке вызвать loadFromFXML - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть серия всплывающих окон, в которых я редактирую или просматриваю конкретные объекты.Я использую эти всплывающие окна для редактирования различных объектов, которые обрабатываются с помощью ORM (ORMLite). Я пытаюсь достичь общего / абстрактного класса, который реализует подобное поведение посредством инкапсулирующих методов.Поскольку я не хочу иметь один и тот же FXML для всех всплывающих диалогов, я придумал создать «шаблонный» FXML, загрузить его с помощью функции loadFXML (), предоставленной Griffon, и сохранить его в объекте Node, чтобыкорень созданной сцены в абстрактном классе.Я знаком с внедрением зависимостей, но мне неизвестно об AST фреймворка, поэтому мой класс Abstract может вызывать loadFromFXML () внутри созданного мной класса Abstract.

Я публикую свой код здесь:

Конкретный класс, реализующий абстрактный класс ViewPopUp, который я создал:

    @ArtifactProviderFor(GriffonView.class)
    public class VerConductoresView extends AbstractViewPopUp<ObservablePlanilla> {
    private VerConductoresController controller;
    private ConductoresModel model;

    VerConductoresView() {
        super(ObservablePlanilla.class, Conductor.class);
        nodeM = new GridPane();
        super.setController(controller);
    }


    @Override
    public void initUI() {
        Stage stage = (Stage) getApplication()
            .createApplicationContainer(Collections.<String,Object>emptyMap());
        stage.setTitle(getApplication().getConfiguration().getAsString("application.title"));
        stage.setScene(init());
        stage.sizeToScene();
        getApplication().getWindowManager().attach("ver-conductores", stage);
    }
}

Абстрактный вид PopUp, который я создал:

public abstract class AbstractViewPopUp<T> extends AbstractJavaFXGriffonView {
    protected Class klazz;
    protected Class<T> klazz2;
    protected Scene viewScene;
    protected ViewControllerPopUp viewController;
    protected TableView tableView;
    protected GridPane gridPane;
    protected String[] ignoredNames;
    protected String[] columnNames;
    protected IModel<T> viewModel;
    protected Node nodeM;

    @MVCMember
    public void setController(ViewControllerPopUp controller) {
        this.viewController = controller;
    }


    AbstractViewPopUp(Class<T> k1, Class k2, Node node){
        klazz = k2;
        klazz2 = k1;
        nodeM = node;
        nodeM = loadFromFXML("com.softgan.viewPopUp");
        nodeM = node;
    }

    AbstractViewPopUp(Class<T> k1, Class k2){
        klazz = k2;
        klazz2 = k1;
        nodeM = loadFromFXML("com.softgan.viewPopUp");
    }

    protected Scene init() {
        Scene scene = new Scene(new Group());

        if (nodeM instanceof Parent) {
            scene.setRoot((Parent) nodeM);
        } else {
            ((Group) scene.getRoot()).getChildren().addAll(nodeM);
        }

        connectActions(nodeM, viewController);
        connectMessageSource(nodeM);
        return scene;
    }
}

Я хочу загрузить FXML через класс Abstract, а затемсохраните его, чтобы конкретный класс мог получить доступ к загруженному FXML, чтобы я мог манипулировать его содержимым, динамически добавляя метки и текстовые поля.Кажется, проблема в том, что loadFromFXML вызывает исключение NullPointerException, так как он не может разрешить файл FXML из ресурсов.Я уже пытался использовать преобразование AST, чтобы сделать его осведомленным о ресурсах, но это, кажется, не правильный подход, поскольку Guice не может разрешить, я думаю, ResourceHandler.

EDIT

Это полученная мной Stacktrace:

[griffon-pool-1-thread-2] WARN org.codehaus.griffon.runtime.core.controller.AbstractActionManager - An exception occurred when executing com.softgan.ConductoresController.view
griffon.exceptions.InstanceMethodInvocationException: An error occurred while invoking instance method com.softgan.ConductoresController.view()
    at griffon.util.GriffonClassUtils.invokeExactInstanceMethod(GriffonClassUtils.java:3186)
Caused by: griffon.exceptions.GriffonException: An error occurred while executing a task inside the UI thread
    at com.softgan.ConductoresController.view(ConductoresController.java:122)
    at griffon.util.MethodUtils.invokeExactMethod(MethodUtils.java:407)
    at griffon.util.MethodUtils.invokeExactMethod(MethodUtils.java:356)
    at griffon.util.GriffonClassUtils.invokeExactInstanceMethod(GriffonClassUtils.java:3182)
Caused by: java.util.concurrent.ExecutionException: griffon.exceptions.InstanceNotFoundException: Could not find an instance of type com.softgan.VerConductoresView
    ... 4 more
Caused by: griffon.exceptions.InstanceNotFoundException: Could not find an instance of type com.softgan.VerConductoresView
Caused by: com.google.inject.ProvisionException: Unable to provision, see the following errors:

1) Error injecting constructor, java.lang.NullPointerException
  at com.softgan.VerConductoresView.<init>(VerConductoresView.java:31)
  while locating com.softgan.VerConductoresView

1 error
    at com.google.inject.internal.InternalProvisionException.toProvisionException(InternalProvisionException.java:226)
    at com.google.inject.internal.InjectorImpl$1.get(InjectorImpl.java:1053)
    at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1086)
Caused by: java.lang.NullPointerException
    at com.softgan.AbstractViewPopUp.<init>(AbstractViewPopUp.java:72)
    at com.softgan.VerConductoresView.<init>(VerConductoresView.java:31)
    at com.softgan.VerConductoresView$$FastClassByGuice$$d0c2bde8.newInstance(<generated>)
    at com.google.inject.internal.DefaultConstructionProxyFactory$FastClassProxy.newInstance(DefaultConstructionProxyFactory.java:89)
    at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:114)
    at com.google.inject.internal.ConstructorInjector.access$000(ConstructorInjector.java:32)
    at com.google.inject.internal.ConstructorInjector$1.call(ConstructorInjector.java:98)
    at com.google.inject.internal.ProvisionListenerStackCallback$Provision.provision(ProvisionListenerStackCallback.java:112)
    at com.google.inject.internal.ProvisionListenerStackCallback$Provision.provision(ProvisionListenerStackCallback.java:120)
    at com.google.inject.internal.ProvisionListenerStackCallback.provision(ProvisionListenerStackCallback.java:66)
    at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:93)
    at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:306)
    at com.google.inject.internal.InjectorImpl$1.get(InjectorImpl.java:1050)
    ... 1 more
[griffon-pool-1-thread-2] ERROR griffon.core.GriffonExceptionHandler - Uncaught Exception. Stacktrace was sanitized. Set System property 'griffon.full.stacktrace' to 'true' for full report.
griffon.exceptions.InstanceMethodInvocationException: An error occurred while invoking instance method com.softgan.ConductoresController.view()
    at griffon.util.GriffonClassUtils.invokeExactInstanceMethod(GriffonClassUtils.java:3186)
Caused by: griffon.exceptions.GriffonException: An error occurred while executing a task inside the UI thread
    at com.softgan.ConductoresController.view(ConductoresController.java:122)
    at griffon.util.MethodUtils.invokeExactMethod(MethodUtils.java:407)
    at griffon.util.MethodUtils.invokeExactMethod(MethodUtils.java:356)
    at griffon.util.GriffonClassUtils.invokeExactInstanceMethod(GriffonClassUtils.java:3182)
Caused by: java.util.concurrent.ExecutionException: griffon.exceptions.InstanceNotFoundException: Could not find an instance of type com.softgan.VerConductoresView
    ... 4 more
Caused by: griffon.exceptions.InstanceNotFoundException: Could not find an instance of type com.softgan.VerConductoresView
Caused by: com.google.inject.ProvisionException: Unable to provision, see the following errors:

1) Error injecting constructor, java.lang.NullPointerException
  at com.softgan.VerConductoresView.<init>(VerConductoresView.java:31)
  while locating com.softgan.VerConductoresView

1 error
    at com.google.inject.internal.InternalProvisionException.toProvisionException(InternalProvisionException.java:226)
    at com.google.inject.internal.InjectorImpl$1.get(InjectorImpl.java:1053)
    at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1086)
Caused by: java.lang.NullPointerException
    at com.softgan.AbstractViewPopUp.<init>(AbstractViewPopUp.java:72)
    at com.softgan.VerConductoresView.<init>(VerConductoresView.java:31)
    at com.softgan.VerConductoresView$$FastClassByGuice$$d0c2bde8.newInstance(<generated>)
    at com.google.inject.internal.DefaultConstructionProxyFactory$FastClassProxy.newInstance(DefaultConstructionProxyFactory.java:89)
    at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:114)
    at com.google.inject.internal.ConstructorInjector.access$000(ConstructorInjector.java:32)
    at com.google.inject.internal.ConstructorInjector$1.call(ConstructorInjector.java:98)
    at com.google.inject.internal.ProvisionListenerStackCallback$Provision.provision(ProvisionListenerStackCallback.java:112)
    at com.google.inject.internal.ProvisionListenerStackCallback$Provision.provision(ProvisionListenerStackCallback.java:120)
    at com.google.inject.internal.ProvisionListenerStackCallback.provision(ProvisionListenerStackCallback.java:66)
    at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:93)
    at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:306)
    at com.google.inject.internal.InjectorImpl$1.get(InjectorImpl.java:1050)
    ... 1 more

UPDATE

Я уже обнаружил, в чем проблема.Конструктор не знал о методе loadFromFXML, так как в конструкторе представления пользовательский интерфейс еще не был загружен.Я просто поместил loadFromFXML () в метод init () абстрактного класса и вызвал его непосредственно из класса конкретного представления.Я узнал об этом, вызвав loadFromFXML из метода initUI, из которого можно получить доступ к интерфейсу пользователя.

1 Ответ

0 голосов
/ 16 февраля 2019

Преобразования AST применяются только в том случае, если вы компилируете код Groovy, что может не соответствовать тому, что вы делаете.Метод loadFromFXML() ожидает, что ресурс будет доступен в пути к классам путем сопоставления заданного аргумента с использованием следующего преобразования значения

arg.replaceAll('.', '/') + ".fxml"

Это означает, что ваш код разрешает "com.softgan.viewPopUp" в "com/softgan/viewPopUp.fxml".Этот файл существует в src/main/resources или griffon-app/resources?

...