如何从 Olingo ReferenceProcessor 中的 updateReference 请求中获取引用的实体?
How to get the referenced Entity from updateReference request in Olingo ReferenceProcessor?
我正在开发符合 Odata V4.0 标准的 REST 服务。为此,我正在使用 Apache Olingo v4.2.0 并且我需要实施一些 relationship operations.
为了实现该功能,我实现了 ReferenceProcessor 接口:
package es.mesview.odataapi.service.processors;
import es.mesview.odataapi.data.AbstractManagerDataModel;
import org.apache.olingo.commons.api.data.Entity;
import org.apache.olingo.commons.api.edm.EdmEntitySet;
import org.apache.olingo.commons.api.edm.EdmEntityType;
import org.apache.olingo.commons.api.format.ContentType;
import org.apache.olingo.commons.api.http.HttpMethod;
import org.apache.olingo.commons.api.http.HttpStatusCode;
import org.apache.olingo.server.api.*;
import org.apache.olingo.server.api.deserializer.DeserializerResult;
import org.apache.olingo.server.api.deserializer.ODataDeserializer;
import org.apache.olingo.server.api.processor.ReferenceProcessor;
import org.apache.olingo.server.api.uri.UriInfo;
import org.apache.olingo.server.api.uri.UriParameter;
import org.apache.olingo.server.api.uri.UriResource;
import org.apache.olingo.server.api.uri.UriResourceEntitySet;
import java.io.InputStream;
import java.util.List;
/**
* Created by hector on 11/07/2016.
*/
public class MesViewReferenceProcessor implements ReferenceProcessor {
private OData odata;
private ServiceMetadata serviceMetadata;
private AbstractManagerDataModel abstractManagerDataModel;
public MesViewReferenceProcessor(AbstractManagerDataModel abstractManagerDataModel) {
this.abstractManagerDataModel = abstractManagerDataModel;
}
@Override
public void readReference(ODataRequest request, ODataResponse response, UriInfo uriInfo, ContentType responseFormat) throws ODataApplicationException, ODataLibraryException {
System.out.println("Read reference: Not implemented yet.");
}
@Override
public void createReference(ODataRequest request, ODataResponse response, UriInfo uriInfo, ContentType requestFormat) throws ODataApplicationException, ODataLibraryException {
System.out.println("Create reference: Not implemented yet.");
}
@Override
public void updateReference(ODataRequest request, ODataResponse response, UriInfo uriInfo, ContentType requestFormat) throws ODataApplicationException, ODataLibraryException {
// 1. Retrieve info from URI
// 1.1. retrieve the info about the requested entity set
List<UriResource> resourcePaths = uriInfo.getUriResourceParts();
UriResourceEntitySet uriResourceEntitySet = (UriResourceEntitySet) resourcePaths.get(0);
EdmEntitySet edmEntitySet = uriResourceEntitySet.getEntitySet();
EdmEntityType edmEntityType = uriResourceEntitySet.getEntityType();
// Retrieve the payload
ODataDeserializer deserializer = this.odata.createDeserializer(requestFormat);
// Get reference entity
DeserializerResult reference = deserializer.entityReferences(request.getBody());
// reference.getEntity return null
Entity referencedEntity = reference.getEntity();
List<UriParameter> keyPredicates = uriResourceEntitySet.getKeyPredicates();
HttpMethod httpMethod = request.getMethod();
// Update reference
abstractManagerDataModel.updateReferenceData(edmEntitySet, keyPredicates, referencedEntity, httpMethod, request.getRawBaseUri());
response.setStatusCode(HttpStatusCode.NO_CONTENT.getStatusCode());
}
@Override
public void deleteReference(ODataRequest request, ODataResponse response, UriInfo uriInfo) throws ODataApplicationException, ODataLibraryException {
System.out.println("Delete reference: Not implemented yet.");
}
@Override
public void init(OData odata, ServiceMetadata serviceMetadata) {
this.odata = odata;
this.serviceMetadata = serviceMetadata;
}
}
但是当我尝试获取引用的实体时,它 returns null
(Entity referencedEntity = reference.getEntity();
)。
如何获取引用的实体,或者至少获取实体 ID?
要执行updateReference
,我发送请求:
PUT /odataapi/odata-api.svc/areas(5)/plant/$ref HTTP/1.1
Host: localhost:8080
Content-Type: application/json
Cache-Control: no-cache
Postman-Token: 73ee1876-1685-336f-7cbe-108e5bc9c4b5
{
"@odata.context":"http://localhost:8080/odataapi/odata-api.svc/$metadata#$ref",
"@odata.id":"Plants(2)"
}
您的请求缺少 @odata.context
,这是参考请求必须具备的。这是 OData 文档的 link。
您需要使用方法 "getEntityReferences",它会为您提供负载中所有引用的列表。如果你反序列化一个实体对象,方法 "getEntity" 只会传递一个实体,例如在你的 "updateEntity" 方法中。
我正在开发符合 Odata V4.0 标准的 REST 服务。为此,我正在使用 Apache Olingo v4.2.0 并且我需要实施一些 relationship operations.
为了实现该功能,我实现了 ReferenceProcessor 接口:
package es.mesview.odataapi.service.processors;
import es.mesview.odataapi.data.AbstractManagerDataModel;
import org.apache.olingo.commons.api.data.Entity;
import org.apache.olingo.commons.api.edm.EdmEntitySet;
import org.apache.olingo.commons.api.edm.EdmEntityType;
import org.apache.olingo.commons.api.format.ContentType;
import org.apache.olingo.commons.api.http.HttpMethod;
import org.apache.olingo.commons.api.http.HttpStatusCode;
import org.apache.olingo.server.api.*;
import org.apache.olingo.server.api.deserializer.DeserializerResult;
import org.apache.olingo.server.api.deserializer.ODataDeserializer;
import org.apache.olingo.server.api.processor.ReferenceProcessor;
import org.apache.olingo.server.api.uri.UriInfo;
import org.apache.olingo.server.api.uri.UriParameter;
import org.apache.olingo.server.api.uri.UriResource;
import org.apache.olingo.server.api.uri.UriResourceEntitySet;
import java.io.InputStream;
import java.util.List;
/**
* Created by hector on 11/07/2016.
*/
public class MesViewReferenceProcessor implements ReferenceProcessor {
private OData odata;
private ServiceMetadata serviceMetadata;
private AbstractManagerDataModel abstractManagerDataModel;
public MesViewReferenceProcessor(AbstractManagerDataModel abstractManagerDataModel) {
this.abstractManagerDataModel = abstractManagerDataModel;
}
@Override
public void readReference(ODataRequest request, ODataResponse response, UriInfo uriInfo, ContentType responseFormat) throws ODataApplicationException, ODataLibraryException {
System.out.println("Read reference: Not implemented yet.");
}
@Override
public void createReference(ODataRequest request, ODataResponse response, UriInfo uriInfo, ContentType requestFormat) throws ODataApplicationException, ODataLibraryException {
System.out.println("Create reference: Not implemented yet.");
}
@Override
public void updateReference(ODataRequest request, ODataResponse response, UriInfo uriInfo, ContentType requestFormat) throws ODataApplicationException, ODataLibraryException {
// 1. Retrieve info from URI
// 1.1. retrieve the info about the requested entity set
List<UriResource> resourcePaths = uriInfo.getUriResourceParts();
UriResourceEntitySet uriResourceEntitySet = (UriResourceEntitySet) resourcePaths.get(0);
EdmEntitySet edmEntitySet = uriResourceEntitySet.getEntitySet();
EdmEntityType edmEntityType = uriResourceEntitySet.getEntityType();
// Retrieve the payload
ODataDeserializer deserializer = this.odata.createDeserializer(requestFormat);
// Get reference entity
DeserializerResult reference = deserializer.entityReferences(request.getBody());
// reference.getEntity return null
Entity referencedEntity = reference.getEntity();
List<UriParameter> keyPredicates = uriResourceEntitySet.getKeyPredicates();
HttpMethod httpMethod = request.getMethod();
// Update reference
abstractManagerDataModel.updateReferenceData(edmEntitySet, keyPredicates, referencedEntity, httpMethod, request.getRawBaseUri());
response.setStatusCode(HttpStatusCode.NO_CONTENT.getStatusCode());
}
@Override
public void deleteReference(ODataRequest request, ODataResponse response, UriInfo uriInfo) throws ODataApplicationException, ODataLibraryException {
System.out.println("Delete reference: Not implemented yet.");
}
@Override
public void init(OData odata, ServiceMetadata serviceMetadata) {
this.odata = odata;
this.serviceMetadata = serviceMetadata;
}
}
但是当我尝试获取引用的实体时,它 returns null
(Entity referencedEntity = reference.getEntity();
)。
如何获取引用的实体,或者至少获取实体 ID?
要执行updateReference
,我发送请求:
PUT /odataapi/odata-api.svc/areas(5)/plant/$ref HTTP/1.1
Host: localhost:8080
Content-Type: application/json
Cache-Control: no-cache
Postman-Token: 73ee1876-1685-336f-7cbe-108e5bc9c4b5
{
"@odata.context":"http://localhost:8080/odataapi/odata-api.svc/$metadata#$ref",
"@odata.id":"Plants(2)"
}
您的请求缺少 @odata.context
,这是参考请求必须具备的。这是 OData 文档的 link。
您需要使用方法 "getEntityReferences",它会为您提供负载中所有引用的列表。如果你反序列化一个实体对象,方法 "getEntity" 只会传递一个实体,例如在你的 "updateEntity" 方法中。