2017-02-08 3 views
-1

В первой версии моей программы, я загружаю В начало без проблем на этом пути:Не удается получить интерфейс весной

public class MyUI extends UI { 

    public void showMainView() { 
     addStyleName(ValoTheme.UI_WITH_MENU); 
     setContent(new MainScreen(MyUI.this)); 
     mainScreen.setUI(MyUI.this); 
    } 

    public static MyUI get() { 
     return (MyUI) UI.getCurrent(); 
    } 
} 

Но теперь я изменил его:

@SpringUI 
@Viewport("user-scalable=no,initial-scale=1.0") 
@Theme("mytheme") 

public class MyUI extends UI { 

    @Autowired 
    MainScreen mainScreen; 

    public void showMainView() { 
     addStyleName(ValoTheme.UI_WITH_MENU); 
     setContent(mainScreen); 
     getNavigator().navigateTo(getNavigator().getState()); 
    } 

    public static MyUI get() { 
     return (MyUI) UI.getCurrent(); 
    } 

} 

Чтобы получить MainScreen через @Autowired, мне пришлось очистить конструктор MainScreen, но я не знаю, как получить пользовательский интерфейс, который мне нужен для навигатора.

Я просто получаю null в обоих направлениях.

@Component 
@UIScope 
public class MainScreen extends HorizontalLayout { 

    public MainScreen() { 

     UI ui = UI.getCurrent();  // is null 
     MyUI ui2 = MyUI.get();  // is null 

     CssLayout viewContainer = new CssLayout(); 
     viewContainer.addStyleName("valo-content"); 
     viewContainer.setSizeFull(); 

     final Navigator navigator = new Navigator(ui, viewContainer); 

     // ... 

} 
+0

Обычно [navigator] (https://vaadin.com/docs/-/part/framework/advanced/advanced-navigator.html) настраивается при инициализации пользовательского интерфейса, поскольку они довольно связаны между собой, и это своего рода логическое место для этого. Вы также можете проверить [Vaadin wiki для быстрой интеграции весна-ваадин] (https://vaadin.com/wiki/-/wiki/Spring+Vaadin/I+-+Getting+Started+with+Vaadin+Spring+and+ Spring + Boot) (обязательно прочитайте все 5 разделов, третий - для навигации). – Morfic

ответ

0

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

Если вы @AutowireMainScreen в UI, вы позволяете весне гарантировать то, что должно быть там. Если вы посмотрите на это, используя предпочтительную инъекцию конструктора, это может быть более очевидным.

public class MyUI extends UI { 

    private MainScreen mainScreen; 

    @Autowired 
    public MyUI (MainScreen mainScreen) { 
     this.mainScreen = mainScreen; 
    } 
} 

MainScreen уже инициализируется в тот момент, и вполне может быть и в других частях кода уже поэтому mainScreen конструктор не должен зависеть от MyUI.

Как вы справляетесь с этим, это зависит от того, каково желаемое поведение и отношения. Если вам нужен класс UI в mainScreen, но он не может зависеть от его доступности, вам придется передать его с самого класса UI (mainScreen.foo(this);).

Смежные вопросы