hibernate Hibersap从ArrayList返回HashMaps而不是所需的Object

btqmn9zl  于 2023-08-06  发布在  其他
关注(0)|答案(3)|浏览(133)

我正在使用一个后端应用程序,它使用Hibersap 1.2.0将SAP逻辑Map到我们的服务中。
我在访问ArrayList中的元素时遇到了一个问题,下面是我的类:

import org.hibersap.annotations.BapiStructure;
import org.hibersap.annotations.Parameter;
import org.hibersap.annotations.ParameterType;
import org.hibersap.annotations.Table;

import java.util.List;

@BapiStructure
public class RFC_BP_Export {

    @Parameter("PARTNER")
    private String partner;

    @Parameter("NOMBREC")
    private String nombreC;

    @Parameter("DIRECCION")
    private String direccion;

    @Parameter("SMTP_ADDR")
    private String smtpAddr;

    @Parameter("TEL_NUMBER")
    private String telNumber;

    @Table
    @Parameter(value = "PERSONA_CONTACTO", type = ParameterType.STRUCTURE)
    private List<RFC_PERSONA_CONTACTO_Export> rfcPersonaContactoExportList;

    ... Getter and Setters...

    public void setRfcPersonaContactoExportList(List<RFC_PERSONA_CONTACTO_Export> rfcPersonaContactoExportList) {
        this.rfcPersonaContactoExportList = rfcPersonaContactoExportList;
    }

    @Override
    public String toString() {
        return "RFC_BP_Export{" +
                "partner='" + partner + '\'' +
                ", nombreC='" + nombreC + '\'' +
                ", direccion='" + direccion + '\'' +
                ", smtpAddr='" + smtpAddr + '\'' +
                ", telNumber='" + telNumber + '\'' +
                ", rfcPersonaContactoExportList=" + rfcPersonaContactoExportList +
                '}';
    }
}

字符串
列表rfcPersonaContactoExportList应包含以下类的ArrayList:

import org.hibersap.annotations.BapiStructure;
import org.hibersap.annotations.Parameter;

    @BapiStructure
    public class RFC_PERSONA_CONTACTO_Export{

        @Parameter("PARTNER")
        private String partner;

        @Parameter("NOMBREC")
        private String nombreC;

        @Parameter("DIRECCION")
        private String direccion;

        @Parameter("SMTP_ADDR")
        private String smtpAddr;

        @Parameter("TEL_NUMBER")
        private String telNumber;

        @Parameter("XDFREL")
        private String xdfRel;

        ....Getters and Setters...

        @Override
        public String toString() {
            return "RFC_PERSONA_CONTACTO_Export{" +
                    "partner='" + partner + '\'' +
                    ", nombreC='" + nombreC + '\'' +
                    ", direccion='" + direccion + '\'' +
                    ", smtpAddr='" + smtpAddr + '\'' +
                    ", telNumber='" + telNumber + '\'' +
                    ", xdfRel='" + xdfRel + '\'' +
                    '}';
        }
    }


但是当我试图从List中获取一个元素时,它返回一个HashMap对象,而不是RFC_PERSONA_CONTACTO_Export对象。举例来说:

for(RFC_PERSONA_CONTACTO_Export contacto_export : bpExport.getRfcPersonaContactoExportList()){
     System.out.println("contacto " + bpExport);
}


抛出一个异常,表明HashMap无法转换为RFC_PERSONA_CONTACTO_Export。
我的类中是否缺少注解?为什么我不能访问我想要的对象?

kt06eoxx

kt06eoxx1#

我不知道完整的Map,但我猜从你张贴的代码,你有一个表内的一个出口参数。Hibersap当前版本不支持此功能。但是,我们正在努力使其成为下一个版本。

falq053o

falq053o2#

为了解决这个问题,我必须使用以下代码:

Object contactoExportObj = bsExport.getRfcPersonaContactoExportList().get(i);
            HashMap<String, String> contactoHashMap = null;
            RFC_PERSONA_CONTACTO_Export rfcPersonaContact = new RFC_PERSONA_CONTACTO_Export();
            if(contactoExportObj instanceof HashMap){
                contactoHashMap = (HashMap<String, String>) contactoExportObj;
                rfcPersonaContact.setPartner(contactoHashMap.get("PARTNER"));
                rfcPersonaContact.setDireccion(contactoHashMap.get("DIRECCION"));
                rfcPersonaContact.setNombreC(contactoHashMap.get("NOMBREC"));
                rfcPersonaContact.setSmtpAddr(contactoHashMap.get("SMTP_ADDR"));
                rfcPersonaContact.setTelNumber(contactoHashMap.get("TEL_NUMBER"));
                rfcPersonaContact.setXdfRel(contactoHashMap.get("XDFREL"));

                contactManager.syncContact(rfcPersonaContact);
                accountContactManager.syncAccountContact(bsExport.getPartner(), rfcPersonaContact.getPartner(), isPrimary(rfcPersonaContact.getXdfRel()));
            }

字符串
正如你所看到的,我将列表中的元素赋值给一个Object示例,然后创建一个HashMap变量,由于在编译时强制转换contactoExportObj会抛出错误,我使用了一个if语句在运行时检查我得到的示例,然后我继续将信息传递给我想要的对象。
我知道这不是一个理想的解决方案,Hibersap的git有一个分支解决方案,但由于项目限制,我们无法使用它使用的依赖项。

r7s23pms

r7s23pms3#

如果你想实现一种特定的转换方式(比如我需要HashMap to List Converter),你可以实现你自己的,然后像这样使用它:

@Table
  @Parameter("VENDOR")
  @Convert(converter = HashMapToCollectionConverter.class)
  private List<Vendor> vendorItems;

字符串

转换器编码

public class HashMapToCollectionConverter implements Converter<List<Vendor>, Map<String, Object>> {

  @Override
  public List<Vendor> convertToJava(Map<String, Object> sapValue) {
    if (sapValue == null) {
      return new ArrayList();
    }

    List<Vendor> result = new ArrayList();

    // LOGIC HERE

    return result;
  }

  @Override
  public Map<String, Object> convertToSap(List<Vendor> javaValue) {
    if (javaValue == null) {
      return null;
    }

    Map<String, Object> sapValue = new HashMap<>();

    // LOGIC HERE

    return sapValue;
  }

}

相关问题