Hibersap 从 ArrayList 而不是所需的对象返回 HashMap
Hibersap returning HashMaps from ArrayList instead of desired Objects
我正在使用后端应用程序,它使用 Hibersap 1.2.0 将 SAP 逻辑映射到我们的服务中。
我在访问 ArrayList 中的元素时遇到问题,这是我的 class:
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 应包含以下 class 的 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 中获取一个元素时,它 returns 一个 HashMap 对象而不是 RFC_PERSONA_CONTACTO_Export 对象。例如:
for(RFC_PERSONA_CONTACTO_Export contacto_export : bpExport.getRfcPersonaContactoExportList()){
System.out.println("contacto " + bpExport);
}
抛出异常,指出 HashMap 无法转换为 RFC_PERSONA_CONTACTO_Export。
我的 classes 中是否缺少注释?为什么我无法访问我想要的对象?
我不知道完整的映射,但根据您发布的代码我猜想您在导出参数中有一个 table。 Hibersap 当前版本不支持此功能。但是,我们正在努力使其进入下一个版本。
要解决此问题,我必须使用以下代码:
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 有一个分支解决方案,但由于项目限制,我们无法使用它使用的依赖项。
如果您想实现特定的转换方式(比如我需要 HashMap 到列表转换器),您可以实现自己的转换方式,然后像这样使用它:
@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;
}
}
我正在使用后端应用程序,它使用 Hibersap 1.2.0 将 SAP 逻辑映射到我们的服务中。
我在访问 ArrayList 中的元素时遇到问题,这是我的 class:
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 应包含以下 class 的 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 中获取一个元素时,它 returns 一个 HashMap 对象而不是 RFC_PERSONA_CONTACTO_Export 对象。例如:
for(RFC_PERSONA_CONTACTO_Export contacto_export : bpExport.getRfcPersonaContactoExportList()){
System.out.println("contacto " + bpExport);
}
抛出异常,指出 HashMap 无法转换为 RFC_PERSONA_CONTACTO_Export。
我的 classes 中是否缺少注释?为什么我无法访问我想要的对象?
我不知道完整的映射,但根据您发布的代码我猜想您在导出参数中有一个 table。 Hibersap 当前版本不支持此功能。但是,我们正在努力使其进入下一个版本。
要解决此问题,我必须使用以下代码:
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 有一个分支解决方案,但由于项目限制,我们无法使用它使用的依赖项。
如果您想实现特定的转换方式(比如我需要 HashMap 到列表转换器),您可以实现自己的转换方式,然后像这样使用它:
@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;
}
}