如何允许 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(",");
        }
    }
}