Java 在Vaadin网格中显示嵌套的JSON数据

Java 在Vaadin网格中显示嵌套的JSON数据,java,json,spring,Java,Json,Spring,我不熟悉Java和Vaadin,在Vaadin网格中显示数据时遇到了麻烦。我有JSON格式的数据,如: [ { "id":1, "name":"testSiteC", "accountId":1, "accountData":{ "id":1, "name":"testAccountA", "code":"AC0001", "salesStaffId":200

我不熟悉Java和Vaadin,在Vaadin网格中显示数据时遇到了麻烦。我有JSON格式的数据,如:

[  
   {  
      "id":1,
      "name":"testSiteC",
      "accountId":1,
      "accountData":{  
         "id":1,
         "name":"testAccountA",
         "code":"AC0001",
         "salesStaffId":200,
         "samplingDate":1493038800000,
         "startDate":1493038800000,
         "creditPeriod":15,
         "cinNo":"testCinNo",
         "vatRegistrationNo":"testVatRegistrationNo",
         "panNo":"testPanNo",
         "serviceTaxRegistrationNo":"testServiceTaxRegistrationNo",
         "isActive":true,
         "billingType":"testBillingType",
         "billingBasis":"cup count basis",
         "billingAddress":"billingAddress",
         "consigneeAddress":"test",
         "clientRelationshipManagerStaffId":2,
         "opsManagerId":1,
         "serviceTaxId":1,
         "createdOn":1483209000000,
         "updatedOn":1494949002000
      },
      "building":"3rd floor",
      "locality":"Koramangala",
      "city":"Bangalore",
      "state":"Karnataka",
      "country":"India",
      "peopleCount":100,
      "staffInCharge":1,
      "dailyStartTime":"23:34:23",
      "dailyEndTime":"23:34:34",
      "createdOn":1493799889000,
      "updatedOn":1494945760000,
      "isActive":true,
      "opsStartDate":1493730000000
   }
]
要嵌套的Bean:

package com.chaipoint.boxc.common.model;

import java.io.Serializable;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.Date;

public class SiteResponse implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private Long id;
    private String name;
    private Integer accountId;
    private AccountResponse accountData;
    private String building;
    private String locality;
    private String city;
    private String state;
    private String country;
    private Integer peopleCount;
    private Integer staffInCharge;
    private Time dailyStartTime;
    private Time dailyEndTime;
    private Date createdOn;
    private Timestamp updatedOn;
    private Boolean isActive;
    private Date opsStartDate;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAccountId() {
        return accountId;
    }

    public void setAccountId(Integer accountId) {
        this.accountId = accountId;
    }

    public AccountResponse getAccountData() {
        return accountData;
    }

    public void setAccountData(AccountResponse accountData) {
        this.accountData = accountData;
    }

    public String getBuilding() {
        return building;
    }

    public void setBuilding(String building) {
        this.building = building;
    }

    public String getLocality() {
        return locality;
    }

    public void setLocality(String locality) {
        this.locality = locality;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public Integer getPeopleCount() {
        return peopleCount;
    }

    public void setPeopleCount(Integer peopleCount) {
        this.peopleCount = peopleCount;
    }

    public Integer getStaffInCharge() {
        return staffInCharge;
    }

    public void setStaffInCharge(Integer staffInCharge) {
        this.staffInCharge = staffInCharge;
    }

    public Time getDailyStartTime() {
        return dailyStartTime;
    }

    public void setDailyStartTime(Time dailyStartTime) {
        this.dailyStartTime = dailyStartTime;
    }

    public Time getDailyEndTime() {
        return dailyEndTime;
    }

    public void setDailyEndTime(Time dailyEndTime) {
        this.dailyEndTime = dailyEndTime;
    }

    public Date getCreatedOn() {
        return createdOn;
    }

    public void setCreatedOn(Date createdOn) {
        this.createdOn = createdOn;
    }

    public Timestamp getUpdatedOn() {
        return updatedOn;
    }

    public void setUpdatedOn(Timestamp updatedOn) {
        this.updatedOn = updatedOn;
    }

    public Boolean getIsActive() {
        return isActive;
    }

    public void setIsActive(Boolean isActive) {
        this.isActive = isActive;
    }

    public Date getOpsStartDate() {
        return opsStartDate;
    }

    public void setOpsStartDate(Date opsStartDate) {
        this.opsStartDate = opsStartDate;
    }

    public static long getSerialversionuid() {
        return serialVersionUID;
    }



}
包含嵌套Bean的Bean

public class SitePantryResponse implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private Long id;
    private String name;
    private Integer siteId;
    private SiteResponse siteData;
    private Integer floorNo;
    private Date createdOn;
    private Timestamp updatedOn;
    private Boolean isActive;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getSiteId() {
        return siteId;
    }

    public void setSiteId(Integer siteId) {
        this.siteId = siteId;
    }

    public SiteResponse getSiteData() {
        return siteData;
    }

    public void setSiteData(SiteResponse siteData) {
        this.siteData = siteData;
    }

    public Integer getFloorNo() {
        return floorNo;
    }

    public void setFloorNo(Integer floorNo) {
        this.floorNo = floorNo;
    }

    public Date getCreatedOn() {
        return createdOn;
    }

    public void setCreatedOn(Date createdOn) {
        this.createdOn = createdOn;
    }

    public Timestamp getUpdatedOn() {
        return updatedOn;
    }

    public void setUpdatedOn(Timestamp updatedOn) {
        this.updatedOn = updatedOn;
    }

    public Boolean getIsActive() {
        return isActive;
    }

    public void setIsActive(Boolean isActive) {
        this.isActive = isActive;
    }

    public static long getSerialversionuid() {
        return serialVersionUID;
    }


}
因此,在将数据显示到网格中时,如
table.addColumn(SitePantryResponse::getSiteData::getName).setCaption(“站点名称”)
会抛出:

此表达式的目标类型必须是函数接口'error'

SitePantryResponse::getSiteData::getName

这样链接方法引用是不可能的。您可以改用简单的lambda表达式:

table.addColumn(r -> r.getSideDate().getName()).setCaption("Site Name")
或者,如果您真的想使用方法引用,您可以使用一个助手方法,该方法将链接这些方法并返回这些方法,该方法可在以后传递给:


但是,正如您所看到的,这使得代码更加复杂和冗长,因此没有理由对简单的lambda表达式使用这种方法。

lambda表达式非常适合我。非常感谢你。
<A, B, C> ValueProvider<A, C> chain(Function<A, B> f1, Function<B, C> f2) {
    return f1.andThen(f2)::apply;
}
table.addColumn(chain(SitePantryResponse::getSiteData, SiteResponse::getName)).setCaption("Site Name")