2016-07-12 5 views
0

Я разрабатываю услугу REST, совместимую с Odata V4.0. Для этой цели я использую Apache Olingo v4.2.0, и мне нужно реализовать около relationship operations.Как получить связанный объект с запросом updateReference в Olingo ReferenceProcessor?

Для реализации этой функции, я реализую 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();).

Как получить ссылочный объект или, по крайней мере, идентификатор объекта?

Чтобы выполнить 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)" 
} 

ответ

3

Вам необходимо использовать метод getEntityReferences, который предоставит вам список всех ссылок в полезной нагрузке. Метод «getEntity» будет предоставлять только объект, если вы десериализуете объект объекта, например. в вашем методе updateEntity.

Вот пример из тестового сценария Olingo: https://github.com/apache/olingo-odata4/blob/2e24ffd1d3c343fdec45f8dbf0398783a0a86f3f/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalEntityProcessor.java#L352

0

Ваш запрос не хватает @odata.context, которое должно быть для запроса ссылки. Вот для документации OData link.

+1

Я добавил '@ odata.context' но' reference.getEntity(); 'возвращает нуль. – hecnabae

+0

@hecnabe Не должен ли быть запрос POST? –

+1

PUT используется для обновлений и POST для создания ссылки. @ Odata.context игнорируется десериализатором на стороне сервера. – chrisam