0

我正在使用 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 文件和我的自定义配置:存储库

4

0 回答 0