java.lang.IllegalArgumentException:无法从bean com.ti.project.vaadin.vaadinprojectti.Day的属性集解析属性名hourtoreserve

java.lang.IllegalArgumentException:无法从bean com.ti.project.vaadin.vaadinprojectti.Day的属性集解析属性名hourtoreserve,java,spring,vaadin,Java,Spring,Vaadin,我试图在简单的vaadin UI中打印数据库中的值。我从本教程中做了所有工作: 我对它做了一点修改,我不明白为什么我不能自己设置列。如果我用setColumns和bindInstanceFields注释行,则所有内容都可以工作,但顺序相反。。。在另一种情况下,我得到了标题中提到的错误 代码如下: 日班: package com.ti.project.vaadin.vaadinprojectti; public class Day { private String hourToReser

我试图在简单的vaadin UI中打印数据库中的值。我从本教程中做了所有工作:

我对它做了一点修改,我不明白为什么我不能自己设置列。如果我用setColumns和bindInstanceFields注释行,则所有内容都可以工作,但顺序相反。。。在另一种情况下,我得到了标题中提到的错误

代码如下:

日班:

package com.ti.project.vaadin.vaadinprojectti;

public class Day {
    private String hourToReserve;
    private String reservedOn;

    public Day(String hourToReserve, String reservedOn) {
        this.hourToReserve = hourToReserve;
        this.reservedOn = reservedOn;
    }

    public String getHourToReserve() {
        return hourToReserve;
    }

    public void setHourToReserve(String hourToReserve) {
        this.hourToReserve = hourToReserve;
    }

    public String getReservedOn() {
        return reservedOn;
    }

    public void setReservedOn(String reservedOn) {
        this.reservedOn = reservedOn;
    }
}
日间服务级别:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
public class DayService {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public List<Day> findAll(String dayName) {
        return jdbcTemplate.query(
                "SELECT hourtoreserve, reservedon FROM " + dayName,
                (rs, rowNum) -> new Day(
                        rs.getString("hourtoreserve"),
                        rs.getString("reservedon")));
    }

    public void update(Day day, String dayName){
        jdbcTemplate.update(
                "UPDATE " + dayName + " SET reservedon=?",
                day.getReservedOn());
    }
}
import org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.jdbc.core.jdbc模板;
导入org.springframework.stereotype.Component;
导入java.util.List;
@组成部分
公务舱日间服务{
@自动连线
私有JdbcTemplate JdbcTemplate;
公共列表findAll(字符串dayName){
返回jdbcTemplate.query(
从“+dayName”中选择小时保留、保留,
(rs,rowNum)->新的一天(
rs.getString(“小时储备”),
rs.getString(“reservedon”);
}
公共void更新(Day,String dayName){
jdbcTemplate.update(
“UPDATE”+dayName+“SET reservedon=?”,
day.getReservedOn());
}
}
以及发生错误的Vaadin UI代码:

package com.ti.project.vaadin.vaadinprojectti;

import com.vaadin.data.Binder;
import com.vaadin.server.VaadinRequest;
import com.vaadin.spring.annotation.SpringUI;
import com.vaadin.ui.*;
import org.springframework.beans.factory.annotation.Autowired;


@SpringUI
public class VaadinUI extends UI {

@Autowired
private DayService service;

private Day day;
private Binder<Day> binder = new Binder<>(Day.class);

private Grid<Day> grid = new Grid(Day.class);

@Override
protected void init(VaadinRequest request) {

    updateGrid();

    grid.setColumns("hourtoreserve", "reservedon"); // if this is commented 
    binder.bindInstanceFields(this);           // it works but columns are in wrong order
    VerticalLayout layout = new VerticalLayout(grid);
    setContent(layout);
}

private void updateGrid() {
    List<Day> days = service.findAll("monday");
    grid.setItems(days);
}
package com.ti.project.vaadin.vaadinprojectti;
导入com.vaadin.data.Binder;
导入com.vaadin.server.vaadin请求;
导入com.vaadin.spring.annotation.SpringUI;
导入com.vaadin.ui.*;
导入org.springframework.beans.factory.annotation.Autowired;
@斯普林吉
公共类vaadini扩展了用户界面{
@自动连线
私人日间服务;
私人日;
专用活页夹=新活页夹(日班);
专用电网=新电网(日、班);
@凌驾
受保护的void init(VaadinRequest请求){
updateGrid();
grid.setColumns(“hourtoreserve”、“reservedon”);//如果对此进行了注释
binder.bindInstanceFields(this);//它可以工作,但列的顺序错误
垂直布局=新垂直布局(网格);
设置内容(布局);
}
私有void updateGrid(){
列表天数=service.findAll(“星期一”);
网格。设置项目(天);
}

我解决了我的问题。事实证明,您需要在grid.setColumns()方法中输入您绑定的类的确切变量名!因此,在我的例子中,应该是:

 grid.setColumns("hourToReserve", "reservedOn")
而不是:

 grid.setColumns("hourtoreserve", "reservedon")
应该是:

 grid.setColumns("hourToReserve", "reservedOn")

事实上,Vaadin使用反射来检查bean,因此它将查找houeToReserve属性,而不是hourtoreserve。