You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java使用Olingo2.0.12时OData创建Entity调用添加自定义逻辑方法

实现方案

基于Olingo 2.0.12版本,两个需求都可以直接在重写的createEntity方法内实现,不需要修改框架源码。

识别当前请求的目标实体

直接利用方法入参PostUriInfo即可获取目标实体信息,不需要额外扩展:

  • 调用入参uriParserResultView的getTargetEntitySet()方法,获取当前请求匹配的EDM实体集对象
  • 调用实体集对象的getName()方法,即可拿到目标实体的唯一标识名,和项目中定义的JPA实体名做比对即可完成判断

核心代码片段:

EdmEntitySet targetEntitySet = uriParserResultView.getTargetEntitySet();
String entityName = targetEntitySet.getName();
// 按实体名分支处理
switch (entityName) {
    case "Employee":
        // 员工实体的处理逻辑
        break;
    case "Department":
        // 部门实体的处理逻辑
        break;
    default:
        break;
}

持久化前修改/追加列值

不要直接把原始输入流传给父类默认方法,先解析请求内容、修改属性后再走后续持久化流程即可:

  1. 先根据当前请求的内容类型、目标实体的EDM类型,将输入流中的请求体解析为可修改的属性Map结构
  2. 直接修改Map中已有键对应的值,即可实现原有列值的修改;向Map中新增键值对,即可追加新的列值(注意新增列必须在EDM模型和JPA实体中有对应定义,否则持久化会报错)
  3. 将修改后的属性Map重新序列化为输入流,再调用父类的createEntity方法完成后续的校验、持久化流程即可

注意:InputStream只能读取一次,读取原始请求内容后必须重新构造流对象传给父类方法,否则会出现空请求的问题。

完整参考代码:

@Override
public ODataResponse createEntity(final PostUriInfo uriParserResultView, final InputStream content,
                                  final String requestContentType, final String contentType) throws ODataJPAModelException,
        ODataJPARuntimeException, ODataNotFoundException, EdmException, EntityProviderException {
    // 1. 识别目标实体
    EdmEntitySet targetEntitySet = uriParserResultView.getTargetEntitySet();
    String entityName = targetEntitySet.getName();

    // 2. 解析原始请求体
    EdmEntityType entityType = targetEntitySet.getEntityType();
    ODataEntityProviderProperties properties = ODataEntityProviderPropertiesBuilder.init().build();
    Map<String, Object> originalProps = EntityProvider.readEntry(requestContentType, entityType, content, properties)
            .getProperties();

    // 3. 针对指定实体修改/追加属性
    if ("Employee".equals(entityName)) {
        // 修改已有列:强制设置创建人
        originalProps.put("createUser", "system");
        // 追加新列:补充默认部门编码
        originalProps.put("deptCode", "D001");
    }

    // 4. 把修改后的属性重新转成输入流
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    JsonEntityProvider.writeEntry(contentType, entityType, originalProps, EntityProviderWriteProperties.init().build(), outputStream);
    InputStream modifiedContent = new ByteArrayInputStream(outputStream.toByteArray());

    // 5. 调用父类默认逻辑走后续持久化
    return super.createEntity(uriParserResultView, modifiedContent, requestContentType, contentType);
}

内容的提问来源于stack exchange,提问作者DAIRAV

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 14:48:21