我正在使用 SAP 开发的 Java 的云应用程序编程模型,为我的同事公开 OData 服务。这与 Spring 相结合。服务在 cds 文件中定义如下:
service POAccrualDataController {
entity POAccrualData {
key OPSYS : String(3);
EBELN : Integer;
controller : String(25);
}
}
作为测试,我制作了简单的控制器:
@Controller
@ServiceName("POAccrualDataController")
public class POAccrualDataController2 implements EventHandler {
@Autowired
private POAccrualDataService poAccrualDataService;
@On(event = CdsService.EVENT_CREATE, entity = "POAccrualDataController.POAccrualData")
public void onCreate(POAccrualData data) {
POAccrualDataDTO dto = new POAccrualDataDTO();
dto.setOPSYS(data.getOpsys());
dto.setEBELN(data.getEbeln());
dto.setController(data.getController());
poAccrualDataService.insertPOAccrualData(dto);
}
@On(event = CdsService.EVENT_READ, entity = "POAccrualDataController.POAccrualData")
public List<POAccrualData> onRead() {
List<POAccrualDataDTO> dtoList = poAccrualDataService.getAllPOAccrualData();
List<POAccrualData> result = new ArrayList<>();
for(POAccrualDataDTO dto : dtoList) {
POAccrualData data = POAccrualData.create();
data.setOpsys(dto.getOPSYS());
data.setEbeln(dto.getEBELN());
data.setController(dto.getController());
result.add(data);
}
return result;
}
}
由数据库映射的已定义数据传输对象如下所示:
@Entity
@Table(schema = "databroker")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class POAccrualDataDTO {
@Id
@Column
private String OPSYS;
@Column
private Integer EBELN;
@Column
private String controller;
}
控制器使用如下所示的服务:
@Service
public class POAccrualDataService {
@Autowired
private POAccrualDataRepository poAccrualDataRepository;
public void insertPOAccrualData(POAccrualDataDTO data) {
poAccrualDataRepository.save(data);
}
public List<POAccrualDataDTO> getAllPOAccrualData() {
return poAccrualDataRepository.findAll();
}
}
这是可以访问的
@Repository
public interface POAccrualDataRepository extends JpaRepository<POAccrualDataDTO, Long> {}
liquibase 正在建立数据库。问题是,当服务器启动并且我尝试访问 http://localhost:8080/odata/v4/POAccrualDataController/POAccrualData 时,GET 请求成功执行,并且在日志中我可以看到来自休眠的以下条目:
org.hibernate.SQL : select poaccruald0_.OPSYS as opsys1_0_,
poaccruald0_.EBELN as ebeln2_0_, poaccruald0_.controller as controll3_0_ from
databroker.POAccrualDataDTO poaccruald0_
但是当我使用 Postman 对 POST 执行相同操作时,会使用以下正文触发请求:
{
"OPSYS": "XXX",
"EBELN": 10,
"controller": "controller"
}
产生这个输出:
org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "POACCRUALDATACONTROLLER_POACCRUALDATA" not
found; SQL statement: INSERT INTO POAccrualDataController_POAccrualData (EBELN, OPSYS,
controller) VALUES (?, ?, ?)
执行保存时,表名由于某种原因发生更改,因此我无法将新对象持久保存到数据库中。如果一切正常,我检查了 H2 控制台,并且以这种方式执行 SQL 插入是可行的。我还提供了自定义命名策略来检查某些标识符是否被确定错误,这似乎不是问题。我相信 SAP 提供的 CAP 库定义了自己的 Spring bean,它们覆盖了一些默认行为——因此我提供了自己的 JPA 配置来恢复一些属性。有谁知道,问题的根源是什么?链接到包含完整项目的存储库,您可以在其中找到 pom.xml、liquibase 文件和我的自定义配置:存储库。