我正在尝试在vaadin应用程序中实现Spring视图,但在SpringViewProvider上却得到了NPE(“无法添加空视图提供程序”)。这是我的代码:

@SpringUI(path = "permalink")
@Theme("myTheme")
public class PermalinkUI extends UI {

@Autowired
private SpringViewProvider springViewProvider;

private Navigator navigator;

@Override
protected void init(VaadinRequest request) {

  final VerticalLayout root = new VerticalLayout();
  root.setSizeFull();
  root.setMargin(true);
  root.setSpacing(true);
  setContent(root);

  final Panel viewContainer = new Panel();
  viewContainer.setSizeFull();
  root.addComponent(viewContainer);
  root.setExpandRatio(viewContainer, 1.0f);


  navigator = new Navigator(this, viewContainer);
  navigator.addProvider(springViewProvider);
  setNavigator(navigator);

  setContent(root);

我也尝试过使用ViewDisplay代替单个组件容器(根),但结果相同。我还实现了一个测试视图以导航到:
@SpringView(name = "test")
public class PermalinkTest extends VerticalLayout implements View {


@Override
public void enter(ViewChangeListener.ViewChangeEvent event) {
  removeAllComponents();
  String params = event.getParameters();
  addComponent(new Label(params));
 }
}

我在写此URL“localhost:8080 / permalink / test”时得到了这个NPE。
我想念什么? SpringViewProvider是否应该自动接线?

问候约翰

最佳答案

使用vaadin-spring-2.0.0时,SpringNavigator是托管的@UIScope编码的bean,因此可以直接注入。 (如果您不需要它,则根本不需要注入SpringViewProvider。)

此外,您必须手动初始化SpringNavigator实例以防止NullPointerException:

@SpringUI
public class SampleUi extends UI {

    @Inject
    private SpringNavigator navigator;

    @Override
    protected void init(VaadinRequest request) {
        navigator.init(this, this); // Explicit init() call
        navigator.navigateTo(StartView.NAME);
    }
}

07-24 15:20