0

我正在开发符合 Odata V4.0 的 REST 服务。为此,我使用的是Apache Olingo v4.2.0,我需要实现一些关系操作

为了实现该功能,我实现了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;
    }
}

但是当我尝试获取引用的实体时,它会返回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)"
}
4

2 回答 2

3

您需要使用“getEntityReferences”方法,该方法将为您提供有效负载中所有引用的列表。如果您反序列化实体对象,例如在您的“updateEntity”方法中,方法“getEntity”将只提供一个实体。

这是 Olingo 测试场景中的示例:https ://github.com/apache/olingo-odata4/blob/2e24ffd1d3c343fdec45f8dbf0398783a0a86f3f/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/处理器/TechnicalEntityProcessor.java#L352

于 2016-07-15T11:51:33.440 回答
0

您的请求缺少@odata.context参考请求的必备条件。这是 OData 文档的链接

于 2016-07-14T03:56:47.957 回答