2017-08-02 12 views
1

olingoを使用してOData v4プロトコルでrestサービスを行っています。ODataで3つ以上のセグメントナビゲーションを実装する方法4

Company.svc/Departaments(X)/従業員(X)/ BussinesTrips

Olingoのチュートリアルでは2つのセグメントのナビゲーションである例がある:i'vはのは、言わせて得たとき、私は、ナビゲーションに積み重ねてしまいました。最初のセグメントはUriResourceEntitySetで、2番目はUriResourceNavigationです。 この例では、これら2つ(特にentitySet)は、関連するエンティティコレクションをストレージから取得するメソッドのパラメータとして必要です。

私の例では、Company.Svc/UriResourceEntitySet/UriResourceNavigation/UriResourceNavigationがあります。これはUriInfoパラメータから言います。

どうすればいいかわかりません。私はメソッドを変更するか、何らかの理由でPenulimateセグメントをEntitySetにする必要があります。

intrestに感謝し、私はコールバックを待つ。

@Override 
public void readEntityCollection(ODataRequest request, ODataResponse response, UriInfo uriInfo, ContentType responseFormat) 
     throws ODataApplicationException, ODataLibraryException { 
    String lastUri = "lastUriResource"; 
    String sourceNavigationUri = "sourceUriResource"; 

    EdmEntitySet responseEntitySet = null; 
    EntityCollection responseEntityCollection = null; 

    List<UriResource> resourcePaths = uriInfo.getUriResourceParts(); 
    UriResource uriResource = resourcePaths.get(0); 
    if (!(uriResource instanceof UriResourceEntitySet)) { 
     throw new ODataApplicationException("Only EntitySet is supported", HttpStatusCode.NOT_IMPLEMENTED.getStatusCode(), Locale.ENGLISH); 
    } 

    UriResourceEntitySet uriResourceEntitySet = (UriResourceEntitySet) uriResource; 
    EdmEntitySet startEntitySet = uriResourceEntitySet.getEntitySet(); 
    if (resourcePaths.size() == 1) { 
     responseEntitySet = startEntitySet; 
     responseEntityCollection = storage.readEntitySetData(responseEntitySet); 
    } else { 
     startEntitySet = Util.getNavigationTargetEntitySet(uriInfo); 
     HashMap<String, UriResource> uriResourceHashMap = Util.getLastNavigationAndItsSource(uriInfo); 
     UriResource lastUriResource = uriResourceHashMap.get(lastUri); 
     UriResource sourceUriResource = uriResourceHashMap.get(sourceNavigationUri); 
     EdmNavigationProperty edmNavigationProperty = null; 
     if (!(lastUriResource instanceof UriResourceNavigation)) { 
      throw new ODataApplicationException("Only navigation is supported", HttpStatusCode.NOT_IMPLEMENTED.getStatusCode(), Locale.ENGLISH); 
     } 
     edmNavigationProperty = ((UriResourceNavigation) lastUriResource).getProperty(); 

     if (!(sourceUriResource instanceof UriResourceEntitySet)) { 
      throw new ODataApplicationException("Only Entity Set is supported", HttpStatusCode.NOT_IMPLEMENTED.getStatusCode(), Locale.ENGLISH); 
     } 
     uriResourceEntitySet = (UriResourceEntitySet) sourceUriResource; 
     startEntitySet = uriResourceEntitySet.getEntitySet(); 
     responseEntitySet = Util.getNavigationTargetEntitySet(uriInfo); 
     EdmEntityType targetEntityType = edmNavigationProperty.getType(); 
     List<UriParameter> keyParameters = uriResourceEntitySet.getKeyPredicates(); 

     Entity sourceEntity = storage.readEntityData(startEntitySet, keyParameters); 
     if (sourceEntity == null) { 
      throw new ODataApplicationException("Entity not found", HttpStatusCode.NOT_FOUND.getStatusCode(), Locale.ROOT); 
     } 
     responseEntityCollection = storage.getRelatedEntityCollection(sourceEntity, targetEntityType); 
    } 

    ContextURL contextUrl = ContextURL.with().entitySet(responseEntitySet).build(); 

    final String id = request.getRawBaseUri() + "/" + responseEntitySet.getName(); 
    EntityCollectionSerializerOptions options = EntityCollectionSerializerOptions.with().id(id).contextURL(contextUrl).build(); 
    EdmEntityType edmEntityType = responseEntitySet.getEntityType(); 

    ODataSerializer serializer = odata.createSerializer(responseFormat); 
    SerializerResult serializerResult = serializer.entityCollection(serviceMetaData, edmEntityType, responseEntityCollection, options); 
    InputStream inputStream = serializerResult.getContent(); 

    response.setContent(inputStream); 
    response.setHeader(HttpHeader.CONTENT_TYPE, responseFormat.toContentTypeString()); 
    response.setStatusCode(HttpStatusCode.OK.getStatusCode()); 

} 

}

答えて

1

Departaments(X)UriResourceEntitySetあります。あなたはおそらくそのEdmEntitySetを持っています。変数prevEdmEntitySetに格納されているとします。

従業員(x)UriResourceNavigationです。あなたは、その名前を取得し、上記の変数とそれを使用する必要があります。

String propName = uriResourceNavigation.getProperty().getName(); 
EdmEntitySet currEdmEntitySet = (EdmEntitySet) startEdmEntitySet.getRelatedBindingTarget(propName); 

次に、あなたは(あなたの例ではただ一回)prevEdmEntitySet=currEdmEntitySetで次の反復を開始し、すべてのUriResourceNavigation秒間繰り返す必要があります。

関連する問題