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; }
持久化前修改/追加列值
不要直接把原始输入流传给父类默认方法,先解析请求内容、修改属性后再走后续持久化流程即可:
- 先根据当前请求的内容类型、目标实体的EDM类型,将输入流中的请求体解析为可修改的属性Map结构
- 直接修改Map中已有键对应的值,即可实现原有列值的修改;向Map中新增键值对,即可追加新的列值(注意新增列必须在EDM模型和JPA实体中有对应定义,否则持久化会报错)
- 将修改后的属性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
相关产品推荐
相关产品推荐

