在Vaadin中导航到SpringView后,无法显示数据库中的值

时间:2018-04-23 08:40:18

标签: java spring-boot vaadin

我在显示数据库中的值时遇到问题。 我有:

@SpringUI(path="order")
public class OrderGUI extends UI 

使用构造函数:

public OrderGUI()
    {
        navigator = new Navigator(this, this);
        navigator.addView("GetOrderNumber", GetOrderNumber.class);
        navigator.addView("allpurchasers", AllPurchasersGUI.class);
    }

在GetOrderNumber类中是@SpringView我在点击Button后尝试导航到AllPurchasersGUI:

allPurchasers = new Button("See all purchasers");
        allPurchasers.addClickListener(e -> //getUI().getPage().setLocation("allpurchasers")
                getUI().getNavigator().navigateTo("allpurchasers")
        );

这是一个很大的问题,因为AllPurchasersGUI是:

@Autowired
private final OrderRepository orderRepository;

当我有带参数的构造函数时:

public AllPurchasersGUI(OrderRepository or) {
        System.out.println("allpurchasers");
        this.orderRepository = or;
        this.grid = new Grid<>(Order.class);
        grid.setSizeFull();
    }
但是,但是Vaadin强迫我添加没有参数的构造函数,但是我需要初始化orderRepository,所以我得到一个错误:

Error:(26, 5) java: variable orderRepository might not have been initialized

有没有选项可以避免默认构造函数?还是有其他解决方案吗?

@Edit AllPurchasersGUI类:

package purchasers;

import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener;
import com.vaadin.spring.annotation.SpringView;
import com.vaadin.ui.*;
import order.Order;
import order.OrderRepository;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

@SpringView(name="allpurchasers")
public class AllPurchasersGUI extends VerticalLayout implements View {

    /*@Autowired
    private final OrderRepository orderRepository;*/

    final Grid<Order> grid;

    public AllPurchasersGUI()
    {
        System.out.println("allpurchasers");
        this.grid = new Grid<>(Order.class);
        grid.setSizeFull();
    }

    public AllPurchasersGUI(OrderRepository or) {
        System.out.println("allpurchasers");
        //this.orderRepository = or;
        this.grid = new Grid<>(Order.class);
        grid.setSizeFull();
    }

    @Override
    public void enter(ViewChangeListener.ViewChangeEvent event)
    {
        Notification.show("Im in all purchasers");
        listPurchasers();
    }

    /**
     * method to display orders in grid
     */
    private void listPurchasers()
    {
        //List<Order> allOrders = (List<Order>) orderRepository.findAll();
        Order order = new Order("mwalko", 123L, "klapa", LocalDate.now());
        List<Order> allOrders = new ArrayList<Order>();
        allOrders.add(order);
        grid.setItems(allOrders);
        grid.setColumns("id", "login", "dateOfOrder");
        addComponent(grid);
    }
}

以及删除没有参数的构造函数时的错误:

java.lang.IllegalArgumentException: Unable to create an instance of {0}. Make sure the class has a public no-arg constructor.

2 个答案:

答案 0 :(得分:1)

如果您被迫使用no-arg构造函数,那么您可以使用它并使用@Autowired注释按字段注入OrderRepository。 但是在你的领域被宣布为最终领域之前,你不能这样做。 我更喜欢通过构造函数注入依赖项,但在这种情况下,您可以使用字段注入。

答案 1 :(得分:0)

你能发布完整的AllPurchasersGUI课吗?什么是错误,说你应该有一个空的构造函数。 我想你的类可以扩展某种生成的VaadinView,那么你的构造函数应该没有问题

编辑: 好吧,我试着创建一个像你一样的课程,我没有例外。可能是你无法创建你的存储库,并且无法在AllPurchasersGUI构造函数中创建{0}对0参数的引用的实例?除此之外我害怕我无法帮助你:/