Thierry Templier created OLINGO-534:
---------------------------------------

             Summary: Problem when deserializing an entity with JSON
                 Key: OLINGO-534
                 URL: https://issues.apache.org/jira/browse/OLINGO-534
             Project: Olingo
          Issue Type: Bug
          Components: odata4-server
    Affects Versions: (Java) V4 4.0.0-beta-02
            Reporter: Thierry Templier


Hello,

I try to deserialize an entity sent by an OData client and I have the following 
exception:

Tree should be empty but still has content left.
        at 
org.apache.olingo.server.core.deserializer.json.ODataJsonDeserializer.consumeEntityNode(ODataJsonDeserializer.java:262)
        at 
org.apache.olingo.server.core.deserializer.json.ODataJsonDeserializer.entity(ODataJsonDeserializer.java:156)
        at 
org.apache.olingo.data.providers.ODataProvidersProcessor.updateEntity(ODataProvidersProcessor.java:250)
        at 
org.apache.olingo.server.core.ODataHandler.handleEntityDispatching(ODataHandler.java:636)
        at 
org.apache.olingo.server.core.ODataHandler.handleEntityDispatching(ODataHandler.java:585)
        at 
org.apache.olingo.server.core.ODataHandler.handleResourceDispatching(ODataHandler.java:253)
        at 
org.apache.olingo.server.core.ODataHandler.processInternal(ODataHandler.java:194)
        at 
org.apache.olingo.server.core.ODataHandler.process(ODataHandler.java:111)

After having investigated a bit the problem, it appears that the metadata type 
fields (for example fields like this: fie...@odata.type) aren't handled and 
Jackson parsing tree isn't empty at the very end of the processing.

A quick fix consists in adding the following lines (see 
field.getKey().endsWith(Constants.JSON_TYPE)):

    final List<String> toRemove = new ArrayList<String>();
    Iterator<Entry<String, JsonNode>> fieldsIterator = tree.fields();
    // TODO: Add custom annotation support
    while (fieldsIterator.hasNext()) {
      Map.Entry<String, JsonNode> field = (Map.Entry<String, JsonNode>) 
fieldsIterator.next();
      if (field.getKey().endsWith(Constants.JSON_NAVIGATION_LINK)) {
        (...)
      } else if (field.getKey().endsWith(Constants.JSON_ASSOCIATION_LINK)) {
        (...)
      } else if (field.getKey().endsWith(Constants.JSON_TYPE)) {
        toRemove.add(field.getKey());
      }

After adding these two lines, things work well!



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to