在 s4sdk 中创建 TimeSheetEntry 时出现异常
Exception while creating TimeSheetEntry in s4sdk
目前我正在尝试使用 S4/HANA SDK 创建 TimeSheetEntries
但我遇到了一些问题。
我收到这种异常:
Cannot cast class java.util.HashMap to class com.sap.cloud.sdk.s4hana.datamodel.odata.namespaces.manageworkforcetimesheet.TimeSheetDataFields
当我执行 createTimeSheetEntry
方法时。
难道我做错了什么?我附上了一个我如何使用 API 的简单示例,如果您能指出正确的方向,我将非常感谢您的努力。
public void createHardCodedEntry() throws ODataException {
Calendar c = Calendar.getInstance();
c.set(2017, Calendar.DECEMBER, Calendar.MONDAY);
TimeSheetEntry entry = TimeSheetEntry.builder().timeSheetDate(c)
//.timeSheetIsExecutedInTestRun(false)
//.timeSheetIsReleasedOnSave(true)
.timeSheetOperation("C")
.timeSheetStatus("20")
.personWorkAgreementExternalID("ADMINISTRATOR")
.personWorkAgreement("50000033")
.companyCode("1010")
.timeSheetDataFields(TimeSheetDataFields.builder()
.timeSheetTaskLevel("NONE")
.timeSheetTaskType("ADMI")
.recordedHours(new BigDecimal(12))
.recordedQuantity(new BigDecimal(12))
.timeSheetTaskComponent("WORK")
.controllingArea("A000")
.hoursUnitOfMeasure("H")
.build())
.build();
ErpConfigContext erpConfigContext = new ErpConfigContext("S4HANA_CLOUD"); //this is the name of the destination configured in SCP
TimeSheetEntry savedEntry = new DefaultManageWorkforceTimesheetService().createTimeSheetEntry(entry).execute(erpConfigContext);
}
在修复问题之前,您可以使用 OData 查询生成器 API 和 GSON 进行反序列化,从而使用变通方法。
// use GSON for deserialization steps
final Gson gson = new Gson();
// invoke "toQuery()" to work with OData query builder API
final TimeSheetEntry savedEntry = new DefaultManageWorkforceTimesheetService()
.createTimeSheetEntry(entry)
.toQuery()
.execute(new ErpConfigContext("S4HANA_CLOUD"))
.as(TimeSheetEntry.class);
// deserialize nested TimeSheetDataFields by reading values from the "custom fields"
savedEntry.setTimeSheetDataFields(
gson.fromJson(
gson.toJsonTree(savedEntry.getTimeSheetDataFields().getCustomFields()),
TimeSheetDataFields.class
));
// continue to work with "savedEntry"
结构化字段反序列化失败的问题已在最新版本的 SAP S/4HANA Cloud SDK 中修复。要更新,请在您的 Maven POM 根文件中找到 <dependencyManagement>
并将 sdk-bom
的 <version>
增加到 1.9.2
<?xml version='1.0' encoding='utf-8'?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- ... -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.sap.cloud.s4hana</groupId>
<artifactId>sdk-bom</artifactId>
<version>1.9.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- ... -->
</project>
在编译期间,Maven 会自动从 Maven 中央存储库中获取更新版本。只需在您的本地工作目录中 运行 mvn clean install
即可确保将新的依赖项传播到您的所有项目模块。
目前我正在尝试使用 S4/HANA SDK 创建 TimeSheetEntries
但我遇到了一些问题。
我收到这种异常:
Cannot cast class java.util.HashMap to class com.sap.cloud.sdk.s4hana.datamodel.odata.namespaces.manageworkforcetimesheet.TimeSheetDataFields
当我执行 createTimeSheetEntry
方法时。
难道我做错了什么?我附上了一个我如何使用 API 的简单示例,如果您能指出正确的方向,我将非常感谢您的努力。
public void createHardCodedEntry() throws ODataException {
Calendar c = Calendar.getInstance();
c.set(2017, Calendar.DECEMBER, Calendar.MONDAY);
TimeSheetEntry entry = TimeSheetEntry.builder().timeSheetDate(c)
//.timeSheetIsExecutedInTestRun(false)
//.timeSheetIsReleasedOnSave(true)
.timeSheetOperation("C")
.timeSheetStatus("20")
.personWorkAgreementExternalID("ADMINISTRATOR")
.personWorkAgreement("50000033")
.companyCode("1010")
.timeSheetDataFields(TimeSheetDataFields.builder()
.timeSheetTaskLevel("NONE")
.timeSheetTaskType("ADMI")
.recordedHours(new BigDecimal(12))
.recordedQuantity(new BigDecimal(12))
.timeSheetTaskComponent("WORK")
.controllingArea("A000")
.hoursUnitOfMeasure("H")
.build())
.build();
ErpConfigContext erpConfigContext = new ErpConfigContext("S4HANA_CLOUD"); //this is the name of the destination configured in SCP
TimeSheetEntry savedEntry = new DefaultManageWorkforceTimesheetService().createTimeSheetEntry(entry).execute(erpConfigContext);
}
在修复问题之前,您可以使用 OData 查询生成器 API 和 GSON 进行反序列化,从而使用变通方法。
// use GSON for deserialization steps
final Gson gson = new Gson();
// invoke "toQuery()" to work with OData query builder API
final TimeSheetEntry savedEntry = new DefaultManageWorkforceTimesheetService()
.createTimeSheetEntry(entry)
.toQuery()
.execute(new ErpConfigContext("S4HANA_CLOUD"))
.as(TimeSheetEntry.class);
// deserialize nested TimeSheetDataFields by reading values from the "custom fields"
savedEntry.setTimeSheetDataFields(
gson.fromJson(
gson.toJsonTree(savedEntry.getTimeSheetDataFields().getCustomFields()),
TimeSheetDataFields.class
));
// continue to work with "savedEntry"
结构化字段反序列化失败的问题已在最新版本的 SAP S/4HANA Cloud SDK 中修复。要更新,请在您的 Maven POM 根文件中找到 <dependencyManagement>
并将 sdk-bom
的 <version>
增加到 1.9.2
<?xml version='1.0' encoding='utf-8'?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- ... -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.sap.cloud.s4hana</groupId>
<artifactId>sdk-bom</artifactId>
<version>1.9.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- ... -->
</project>
在编译期间,Maven 会自动从 Maven 中央存储库中获取更新版本。只需在您的本地工作目录中 运行 mvn clean install
即可确保将新的依赖项传播到您的所有项目模块。