如何允许 Introspector.getBeans.getPropertyDescriptors() 导致插入顺序而不是字母顺序
How to allow Introspector.getBeans.getPropertyDescriptors() result in insertion order rather alphabetical order
我 运行 以下是为了获取 Bean 的字段及其值,但我得到的是 属性 名称的字母顺序。
有没有办法得到顺序,他们可以维护bean拥有的顺序?
我的豆子
@Component
public class FeedFile {
private String pkey;
private String omsOrderId;
private String auctTitl;
private String byrCntryId;
private String lstgCurncyIsoCodeName;
private String transSiteId;
public String getPkey() {
return pkey;
}
public void setPkey(String pkey) {
this.pkey = pkey;
}
public String getOmsOrderId() {
return omsOrderId;
}
public void setOmsOrderId(String omsOrderId) {
this.omsOrderId = omsOrderId;
}
public String getAuctTitl() {
return auctTitl;
}
public void setAuctTitl(String auctTitl) {
this.auctTitl = auctTitl;
}
public String getByrCntryId() {
return byrCntryId;
}
public void setByrCntryId(String byrCntryId) {
this.byrCntryId = byrCntryId;
}
public String getLstgCurncyIsoCodeName() {
return lstgCurncyIsoCodeName;
}
public void setLstgCurncyIsoCodeName(String lstgCurncyIsoCodeName) {
this.lstgCurncyIsoCodeName = lstgCurncyIsoCodeName;
}
public String getTransSiteId() {
return transSiteId;
}
public void setTransSiteId(String transSiteId) {
this.transSiteId = transSiteId;
}
内省代码。使用 StringBuilder
来验证 Introspector.getBeans.getPropertyDescriptors()
的顺序即 returns 按字母顺序排列。它与结果中的 hashmap 随机顺序无关。
StringBuilder sb = new StringBuilder();
Map<String, String> result = new HashMap<>();
for (PropertyDescriptor pd : Introspector.getBeanInfo(file.getClass()).getPropertyDescriptors()) {
String name = pd.getName();
Object value = pd.getReadMethod().invoke(file);
if ("class".equals(name)) continue;
sb.append(name);
sb.append(":");
sb.append(value);
sb.append(",");
result.put(name, String.valueOf(value));
}
上述字符串生成器 sb 中的实际输出:
sb.toString()="auctTitl:Hello,byrCntryId:123,lstgCurncyIsoCodeName:USD,omsOrderId:234,pkey:567, transSiteId:987,";
预期输出应该按照上面bean的声明顺序FeedFile
:
sb.toString()="pkey:567,omsOrderId:234,auctTitl:Hello,byrCntryId:123,lstgCurncyIsoCodeName:USD,transSiteId:987,";
我用谷歌搜索,发现 Introspector 按字母顺序排列 returns。有什么办法可以获得预期的输出。
我改变了上面的方法,这大大简化了它。
我实际上找到了使用 PrintWriter
执行此操作的更好方法,其中我的 bean 通过覆盖 java bean 中的 toString()
直接添加到 csv。这是我所做的:
public void writeToCsv(List<Sample> sampleList, String header) throws IOException {
PrintWriter writer = new PrintWriter("filepath/demo/sample.csv");
writer.println(header);
for (Sample sample : sampleList) {
writer.println(sample.toString());
}
writer.close();
}
豆子
class Sample {
private String id;
private String type;
private String name;
private int value;
// getter-setter
@Override
public String toString(){
StringBuilder dataBuilder = new StringBuilder();
appendFieldValue(dataBuilder, id);
appendFieldValue(dataBuilder, type);
appendFieldValue(dataBuilder, name);
appendFieldValue(dataBuilder, value);
return dataBuilder.toString();
}
private void appendFieldValue(StringBuilder dataBuilder, String fieldValue) {
if(fieldValue != null) {
dataBuilder.append(fieldValue).append(",");
} else {
dataBuilder.append("").append(",");
}
}
}
我 运行 以下是为了获取 Bean 的字段及其值,但我得到的是 属性 名称的字母顺序。 有没有办法得到顺序,他们可以维护bean拥有的顺序?
我的豆子
@Component
public class FeedFile {
private String pkey;
private String omsOrderId;
private String auctTitl;
private String byrCntryId;
private String lstgCurncyIsoCodeName;
private String transSiteId;
public String getPkey() {
return pkey;
}
public void setPkey(String pkey) {
this.pkey = pkey;
}
public String getOmsOrderId() {
return omsOrderId;
}
public void setOmsOrderId(String omsOrderId) {
this.omsOrderId = omsOrderId;
}
public String getAuctTitl() {
return auctTitl;
}
public void setAuctTitl(String auctTitl) {
this.auctTitl = auctTitl;
}
public String getByrCntryId() {
return byrCntryId;
}
public void setByrCntryId(String byrCntryId) {
this.byrCntryId = byrCntryId;
}
public String getLstgCurncyIsoCodeName() {
return lstgCurncyIsoCodeName;
}
public void setLstgCurncyIsoCodeName(String lstgCurncyIsoCodeName) {
this.lstgCurncyIsoCodeName = lstgCurncyIsoCodeName;
}
public String getTransSiteId() {
return transSiteId;
}
public void setTransSiteId(String transSiteId) {
this.transSiteId = transSiteId;
}
内省代码。使用 StringBuilder
来验证 Introspector.getBeans.getPropertyDescriptors()
的顺序即 returns 按字母顺序排列。它与结果中的 hashmap 随机顺序无关。
StringBuilder sb = new StringBuilder();
Map<String, String> result = new HashMap<>();
for (PropertyDescriptor pd : Introspector.getBeanInfo(file.getClass()).getPropertyDescriptors()) {
String name = pd.getName();
Object value = pd.getReadMethod().invoke(file);
if ("class".equals(name)) continue;
sb.append(name);
sb.append(":");
sb.append(value);
sb.append(",");
result.put(name, String.valueOf(value));
}
上述字符串生成器 sb 中的实际输出:
sb.toString()="auctTitl:Hello,byrCntryId:123,lstgCurncyIsoCodeName:USD,omsOrderId:234,pkey:567, transSiteId:987,";
预期输出应该按照上面bean的声明顺序FeedFile
:
sb.toString()="pkey:567,omsOrderId:234,auctTitl:Hello,byrCntryId:123,lstgCurncyIsoCodeName:USD,transSiteId:987,";
我用谷歌搜索,发现 Introspector 按字母顺序排列 returns。有什么办法可以获得预期的输出。
我改变了上面的方法,这大大简化了它。
我实际上找到了使用 PrintWriter
执行此操作的更好方法,其中我的 bean 通过覆盖 java bean 中的 toString()
直接添加到 csv。这是我所做的:
public void writeToCsv(List<Sample> sampleList, String header) throws IOException {
PrintWriter writer = new PrintWriter("filepath/demo/sample.csv");
writer.println(header);
for (Sample sample : sampleList) {
writer.println(sample.toString());
}
writer.close();
}
豆子
class Sample {
private String id;
private String type;
private String name;
private int value;
// getter-setter
@Override
public String toString(){
StringBuilder dataBuilder = new StringBuilder();
appendFieldValue(dataBuilder, id);
appendFieldValue(dataBuilder, type);
appendFieldValue(dataBuilder, name);
appendFieldValue(dataBuilder, value);
return dataBuilder.toString();
}
private void appendFieldValue(StringBuilder dataBuilder, String fieldValue) {
if(fieldValue != null) {
dataBuilder.append(fieldValue).append(",");
} else {
dataBuilder.append("").append(",");
}
}
}