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

时间:2017-05-19 10:44:31

标签: java json spring

我是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("Site Name"),它会抛出:

  

此表达式的目标类型必须是函数接口错误。

1 个答案:

答案 0 :(得分:0)

  

SitePantryResponse :: getSiteData ::的getName

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

table.addColumn(r -> r.getSideDate().getName()).setCaption("Site Name")

或者如果你真的想要使用方法引用,你可以使用一个帮助方法来链接它们并返回ValueProvider,然后将其传递给Grid.addColumn

<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")

但是,正如您所看到的,这会使代码更复杂,更长,因此没有理由将此方法用于简单的lambda表达式。