我是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")
,它会抛出:
此表达式的目标类型必须是函数接口错误。
答案 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表达式。