You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ra...@apache.org on 2016/02/09 21:48:52 UTC

olingo-odata4 git commit: OLINGO-874: Error handling improvements

Repository: olingo-odata4
Updated Branches:
  refs/heads/master b7005b774 -> 7a68ae68a


OLINGO-874: Error handling improvements


Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/7a68ae68
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/7a68ae68
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/7a68ae68

Branch: refs/heads/master
Commit: 7a68ae68ad72f13927814700be0debc3b481f008
Parents: b7005b7
Author: Ramesh Reddy <ra...@jboss.org>
Authored: Tue Feb 9 13:10:02 2016 -0600
Committer: Ramesh Reddy <ra...@jboss.org>
Committed: Tue Feb 9 14:44:02 2016 -0600

----------------------------------------------------------------------
 .../apache/olingo/server/core/ErrorHandler.java | 47 ++++++----------
 .../olingo/server/core/OData4HttpHandler.java   | 10 ++--
 .../olingo/server/core/ServiceDispatcher.java   | 39 +++++++++++--
 .../olingo/server/core/ServiceHandler.java      | 13 ++++-
 .../core/legacy/ProcessorServiceHandler.java    |  7 +++
 .../server/core/requests/BatchRequest.java      | 11 +---
 .../server/core/responses/EntityResponse.java   |  1 +
 .../core/responses/EntitySetResponse.java       |  2 +
 .../server/core/responses/ErrorResponse.java    | 58 ++++++++++++++++++++
 .../server/core/responses/MetadataResponse.java |  2 +
 .../server/core/responses/PropertyResponse.java |  2 +
 .../core/responses/ServiceDocumentResponse.java |  2 +
 .../core/responses/ServiceResponseVisior.java   |  4 ++
 .../olingo/server/example/TripPinHandler.java   |  9 ++-
 14 files changed, 155 insertions(+), 52 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/7a68ae68/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ErrorHandler.java
----------------------------------------------------------------------
diff --git a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ErrorHandler.java b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ErrorHandler.java
index 33f65cd..bfccc68 100644
--- a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ErrorHandler.java
+++ b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ErrorHandler.java
@@ -24,18 +24,16 @@ import org.apache.olingo.commons.api.format.ContentType;
 import org.apache.olingo.commons.api.http.HttpHeader;
 import org.apache.olingo.commons.api.http.HttpStatusCode;
 import org.apache.olingo.server.api.OData;
+import org.apache.olingo.server.api.ODataApplicationException;
 import org.apache.olingo.server.api.ODataRequest;
 import org.apache.olingo.server.api.ODataResponse;
 import org.apache.olingo.server.api.ODataServerError;
 import org.apache.olingo.server.api.ServiceMetadata;
 import org.apache.olingo.server.api.deserializer.DeserializerException;
 import org.apache.olingo.server.api.deserializer.batch.BatchDeserializerException;
-import org.apache.olingo.server.api.serializer.CustomContentTypeSupport;
 import org.apache.olingo.server.api.serializer.ODataSerializer;
-import org.apache.olingo.server.api.serializer.RepresentationType;
 import org.apache.olingo.server.api.serializer.SerializerException;
-import org.apache.olingo.server.api.uri.UriInfo;
-import org.apache.olingo.server.core.uri.parser.Parser;
+import org.apache.olingo.server.core.responses.ErrorResponse;
 import org.apache.olingo.server.core.uri.parser.UriParserException;
 import org.apache.olingo.server.core.uri.parser.UriParserSemanticException;
 import org.apache.olingo.server.core.uri.parser.UriParserSyntaxException;
@@ -43,13 +41,16 @@ import org.apache.olingo.server.core.uri.validator.UriValidationException;
 
 public class ErrorHandler {
   private final OData odata;
+  private final ServiceHandler handler;
+  private final ContentType contentType;
   private final ServiceMetadata metadata;
-  private final CustomContentTypeSupport customContent;
-
-  public ErrorHandler(OData odata, ServiceMetadata metadata, CustomContentTypeSupport customContent) {
+  
+  public ErrorHandler(OData odata, ServiceMetadata metadata,
+      ServiceHandler handler, ContentType contentType) {
     this.odata = odata;
+    this.handler = handler;
+    this.contentType = contentType;
     this.metadata = metadata;
-    this.customContent = customContent;
   }
 
   public void handleException(Exception e, ODataRequest request, ODataResponse response) {
@@ -80,7 +81,10 @@ public class ErrorHandler {
     } else if(e instanceof ODataHandlerException) {
       ODataServerError serverError = ODataExceptionHelper.createServerErrorObject((ODataHandlerException)e, null);
       handleServerError(request, response, serverError);
-    } else {
+    } else if(e instanceof ODataApplicationException) {
+      ODataServerError serverError = ODataExceptionHelper.createServerErrorObject((ODataApplicationException)e);
+      handleServerError(request, response, serverError);
+    }else {
       ODataServerError serverError = ODataExceptionHelper.createServerErrorObject(e);
       handleServerError(request, response, serverError);
     }
@@ -88,29 +92,10 @@ public class ErrorHandler {
 
   void handleServerError(final ODataRequest request, final ODataResponse response,
       final ODataServerError serverError) {
-    ContentType requestedContentType;
-    try {
-      final UriInfo uriInfo = new Parser(metadata.getEdm(), odata)
-          .parseUri(request.getRawODataPath(), request.getRawQueryPath(), null);
-      requestedContentType = ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(),
-          request, this.customContent, RepresentationType.ERROR);
-    } catch (final ContentNegotiatorException e) {
-      requestedContentType = ContentType.JSON;
-    } catch (final UriParserException e) {
-      requestedContentType = ContentType.JSON;
-    } catch (final UriValidationException e) {
-      requestedContentType = ContentType.JSON;
-    }
-    processError(response, serverError, requestedContentType);
-  }
-
-  void processError(ODataResponse response, ODataServerError serverError,
-      ContentType requestedContentType) {
     try {
-      ODataSerializer serializer = this.odata.createSerializer(requestedContentType);
-      response.setContent(serializer.error(serverError).getContent());
-      response.setStatusCode(serverError.getStatusCode());
-      response.setHeader(HttpHeader.CONTENT_TYPE, requestedContentType.toContentTypeString());
+      ODataSerializer serializer = this.odata.createSerializer(this.contentType);
+      ErrorResponse errorResponse = new ErrorResponse(this.metadata, serializer, this.contentType, response);
+      handler.processError(serverError, errorResponse);
     } catch (Exception e) {
       // This should never happen but to be sure we have this catch here
       // to prevent sending a stacktrace to a client.

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/7a68ae68/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/OData4HttpHandler.java
----------------------------------------------------------------------
diff --git a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/OData4HttpHandler.java b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/OData4HttpHandler.java
index 7811cdf..18e1364 100644
--- a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/OData4HttpHandler.java
+++ b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/OData4HttpHandler.java
@@ -24,11 +24,12 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
+import org.apache.olingo.commons.api.format.ContentType;
 import org.apache.olingo.commons.api.http.HttpHeader;
 import org.apache.olingo.server.api.OData;
+import org.apache.olingo.server.api.ODataLibraryException;
 import org.apache.olingo.server.api.ODataRequest;
 import org.apache.olingo.server.api.ODataResponse;
-import org.apache.olingo.server.api.ODataLibraryException;
 import org.apache.olingo.server.api.ServiceMetadata;
 import org.apache.olingo.server.api.processor.Processor;
 import org.apache.olingo.server.api.serializer.CustomContentTypeSupport;
@@ -63,12 +64,13 @@ public class OData4HttpHandler extends ODataHttpHandlerImpl {
       ServiceDispatcher dispatcher = new ServiceDispatcher(this.odata, this.serviceMetadata,
           handler, this.customContentTypeSupport);
       dispatcher.execute(request, response);
-
+      
     } catch (Exception e) {
+      // also handle any unchecked exception thrown by service handler for proper serialization
       ErrorHandler handler = new ErrorHandler(this.odata, this.serviceMetadata,
-          this.customContentTypeSupport);
+          this.handler, ContentType.JSON);
       handler.handleException(e, request, response);
-    }
+    }    
     convertToHttp(httpResponse, response);
   }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/7a68ae68/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ServiceDispatcher.java
----------------------------------------------------------------------
diff --git a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ServiceDispatcher.java b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ServiceDispatcher.java
index cb718e1..fc5c88c 100644
--- a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ServiceDispatcher.java
+++ b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ServiceDispatcher.java
@@ -23,16 +23,18 @@ import java.net.URI;
 import java.net.URISyntaxException;
 import java.net.URL;
 
+import org.apache.olingo.commons.api.ex.ODataException;
 import org.apache.olingo.commons.api.format.ContentType;
 import org.apache.olingo.commons.api.http.HttpHeader;
 import org.apache.olingo.commons.api.http.HttpStatusCode;
 import org.apache.olingo.server.api.OData;
 import org.apache.olingo.server.api.ODataApplicationException;
+import org.apache.olingo.server.api.ODataLibraryException;
 import org.apache.olingo.server.api.ODataRequest;
 import org.apache.olingo.server.api.ODataResponse;
-import org.apache.olingo.server.api.ODataLibraryException;
 import org.apache.olingo.server.api.ServiceMetadata;
 import org.apache.olingo.server.api.serializer.CustomContentTypeSupport;
+import org.apache.olingo.server.api.serializer.RepresentationType;
 import org.apache.olingo.server.api.uri.UriInfo;
 import org.apache.olingo.server.api.uri.UriInfoBatch;
 import org.apache.olingo.server.api.uri.UriInfoCrossjoin;
@@ -75,11 +77,36 @@ public class ServiceDispatcher extends RequestURLHierarchyVisitor {
     this.customContentSupport = customContentSupport;
   }
 
-  public void execute(ODataRequest odRequest, ODataResponse odResponse)
-      throws ODataLibraryException, ODataApplicationException {
-
-    UriInfo uriInfo = new Parser(this.metadata.getEdm(), odata)
-        .parseUri(odRequest.getRawODataPath(), odRequest.getRawQueryPath(), null);
+  public void execute(ODataRequest odRequest, ODataResponse odResponse) {
+    ContentType contentType = ContentType.JSON;
+    try {
+      contentType = ContentNegotiator.doContentNegotiation(null,
+          odRequest, this.customContentSupport, RepresentationType.ERROR);
+      
+      UriInfo uriInfo = new Parser(this.metadata.getEdm(), odata)
+      .parseUri(odRequest.getRawODataPath(), odRequest.getRawQueryPath(), null);
+      
+      contentType = ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(),
+          odRequest, this.customContentSupport, RepresentationType.ERROR);      
+      
+      internalExecute(uriInfo, odRequest, odResponse);
+    } catch(ODataLibraryException e) {
+      handleException(e, contentType, odRequest, odResponse);
+    } catch(ODataApplicationException e) {
+      handleException(e, contentType, odRequest, odResponse);
+    }
+  }
+  
+  protected void handleException(ODataException e, ContentType contentType,
+      ODataRequest odRequest, ODataResponse odResponse) {
+    ErrorHandler handler = new ErrorHandler(this.odata, this.metadata,
+        this.handler, contentType);
+    handler.handleException(e, odRequest, odResponse);    
+  }
+  
+  private void internalExecute(UriInfo uriInfo, ODataRequest odRequest,
+      ODataResponse odResponse) throws ODataLibraryException,
+      ODataApplicationException {
 
     new UriValidator().validate(uriInfo, odRequest.getMethod());
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/7a68ae68/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ServiceHandler.java
----------------------------------------------------------------------
diff --git a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ServiceHandler.java b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ServiceHandler.java
index ba96f94..8f8fc1d 100644
--- a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ServiceHandler.java
+++ b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/ServiceHandler.java
@@ -26,9 +26,10 @@ import org.apache.olingo.commons.api.data.Entity;
 import org.apache.olingo.commons.api.data.Property;
 import org.apache.olingo.commons.api.http.HttpMethod;
 import org.apache.olingo.server.api.ODataApplicationException;
+import org.apache.olingo.server.api.ODataLibraryException;
 import org.apache.olingo.server.api.ODataRequest;
 import org.apache.olingo.server.api.ODataResponse;
-import org.apache.olingo.server.api.ODataLibraryException;
+import org.apache.olingo.server.api.ODataServerError;
 import org.apache.olingo.server.api.processor.Processor;
 import org.apache.olingo.server.core.requests.ActionRequest;
 import org.apache.olingo.server.core.requests.DataRequest;
@@ -37,6 +38,7 @@ import org.apache.olingo.server.core.requests.MediaRequest;
 import org.apache.olingo.server.core.requests.MetadataRequest;
 import org.apache.olingo.server.core.requests.ServiceDocumentRequest;
 import org.apache.olingo.server.core.responses.EntityResponse;
+import org.apache.olingo.server.core.responses.ErrorResponse;
 import org.apache.olingo.server.core.responses.MetadataResponse;
 import org.apache.olingo.server.core.responses.NoContentResponse;
 import org.apache.olingo.server.core.responses.PropertyResponse;
@@ -296,4 +298,13 @@ public interface ServiceHandler extends Processor {
    * @return
    */
   boolean supportsDataIsolation();
+  
+  
+  /**
+   * Handle errors generated by the framework as well as the service specific errors. This can be used
+   * one place handle error logging, error modification etc.   
+   * @param error 
+   * @param response
+   */
+  void processError(ODataServerError error, ErrorResponse response);
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/7a68ae68/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/legacy/ProcessorServiceHandler.java
----------------------------------------------------------------------
diff --git a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/legacy/ProcessorServiceHandler.java b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/legacy/ProcessorServiceHandler.java
index db62c0a..d4d0662 100644
--- a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/legacy/ProcessorServiceHandler.java
+++ b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/legacy/ProcessorServiceHandler.java
@@ -32,6 +32,7 @@ import org.apache.olingo.server.api.ODataApplicationException;
 import org.apache.olingo.server.api.ODataRequest;
 import org.apache.olingo.server.api.ODataResponse;
 import org.apache.olingo.server.api.ODataLibraryException;
+import org.apache.olingo.server.api.ODataServerError;
 import org.apache.olingo.server.api.ServiceMetadata;
 import org.apache.olingo.server.api.processor.ComplexCollectionProcessor;
 import org.apache.olingo.server.api.processor.ComplexProcessor;
@@ -59,6 +60,7 @@ import org.apache.olingo.server.core.requests.ServiceDocumentRequest;
 import org.apache.olingo.server.core.responses.CountResponse;
 import org.apache.olingo.server.core.responses.EntityResponse;
 import org.apache.olingo.server.core.responses.EntitySetResponse;
+import org.apache.olingo.server.core.responses.ErrorResponse;
 import org.apache.olingo.server.core.responses.MetadataResponse;
 import org.apache.olingo.server.core.responses.NoContentResponse;
 import org.apache.olingo.server.core.responses.PrimitiveValueResponse;
@@ -442,4 +444,9 @@ public class ProcessorServiceHandler implements ServiceHandler {
   public boolean supportsDataIsolation() {
     return false;
   }
+
+  @Override
+  public void processError(ODataServerError error, ErrorResponse response) {
+    response.writeError(error);
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/7a68ae68/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/requests/BatchRequest.java
----------------------------------------------------------------------
diff --git a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/requests/BatchRequest.java b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/requests/BatchRequest.java
index d14b5ad..2215594 100644
--- a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/requests/BatchRequest.java
+++ b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/requests/BatchRequest.java
@@ -29,16 +29,15 @@ import org.apache.olingo.commons.api.http.HttpHeader;
 import org.apache.olingo.commons.api.http.HttpStatusCode;
 import org.apache.olingo.server.api.OData;
 import org.apache.olingo.server.api.ODataApplicationException;
+import org.apache.olingo.server.api.ODataLibraryException;
 import org.apache.olingo.server.api.ODataRequest;
 import org.apache.olingo.server.api.ODataResponse;
-import org.apache.olingo.server.api.ODataLibraryException;
 import org.apache.olingo.server.api.ServiceMetadata;
 import org.apache.olingo.server.api.deserializer.batch.BatchDeserializerException;
 import org.apache.olingo.server.api.deserializer.batch.BatchOptions;
 import org.apache.olingo.server.api.deserializer.batch.BatchRequestPart;
 import org.apache.olingo.server.api.deserializer.batch.ODataResponsePart;
 import org.apache.olingo.server.core.ContentNegotiatorException;
-import org.apache.olingo.server.core.ErrorHandler;
 import org.apache.olingo.server.core.ServiceDispatcher;
 import org.apache.olingo.server.core.ServiceHandler;
 import org.apache.olingo.server.core.ServiceRequest;
@@ -154,13 +153,7 @@ public class BatchRequest extends ServiceRequest {
     ServiceDispatcher dispatcher = new ServiceDispatcher(this.odata, this.serviceMetadata, handler,
         this.customContentType);
     ODataResponse res = new ODataResponse();
-    try {
-      dispatcher.execute(singleRequest, res);
-    } catch (Exception e) {
-      ErrorHandler ehandler = new ErrorHandler(this.odata, this.serviceMetadata,
-          getCustomContentTypeSupport());
-      ehandler.handleException(e, singleRequest, res);
-    }
+    dispatcher.execute(singleRequest, res);
     return res;
   }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/7a68ae68/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/EntityResponse.java
----------------------------------------------------------------------
diff --git a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/EntityResponse.java b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/EntityResponse.java
index a0bbd14..5f54a24 100644
--- a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/EntityResponse.java
+++ b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/EntityResponse.java
@@ -162,6 +162,7 @@ public class EntityResponse extends ServiceResponse {
   
   public void writeError(ODataServerError error) {
     try {
+      writeHeader(HttpHeader.CONTENT_TYPE, this.responseContentType.getType());
       writeContent(this.serializer.error(error).getContent(), error.getStatusCode(), true);
     } catch (SerializerException e) {
       writeServerError(true);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/7a68ae68/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/EntitySetResponse.java
----------------------------------------------------------------------
diff --git a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/EntitySetResponse.java b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/EntitySetResponse.java
index 0dd2bd8..09a48c1 100644
--- a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/EntitySetResponse.java
+++ b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/EntitySetResponse.java
@@ -24,6 +24,7 @@ import org.apache.olingo.commons.api.data.ContextURL;
 import org.apache.olingo.commons.api.data.EntityCollection;
 import org.apache.olingo.commons.api.edm.EdmEntityType;
 import org.apache.olingo.commons.api.format.ContentType;
+import org.apache.olingo.commons.api.http.HttpHeader;
 import org.apache.olingo.server.api.ODataApplicationException;
 import org.apache.olingo.server.api.ODataResponse;
 import org.apache.olingo.server.api.ODataServerError;
@@ -84,6 +85,7 @@ public class EntitySetResponse extends ServiceResponse {
   
   public void writeError(ODataServerError error) {
     try {
+      writeHeader(HttpHeader.CONTENT_TYPE, this.responseContentType.getType());
       writeContent(this.serializer.error(error).getContent(), error.getStatusCode(), true);
     } catch (SerializerException e) {
       writeServerError(true);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/7a68ae68/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/ErrorResponse.java
----------------------------------------------------------------------
diff --git a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/ErrorResponse.java b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/ErrorResponse.java
new file mode 100644
index 0000000..2e1fbd6
--- /dev/null
+++ b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/ErrorResponse.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.server.core.responses;
+
+import java.util.HashMap;
+
+import org.apache.olingo.commons.api.format.ContentType;
+import org.apache.olingo.commons.api.http.HttpHeader;
+import org.apache.olingo.server.api.ODataApplicationException;
+import org.apache.olingo.server.api.ODataLibraryException;
+import org.apache.olingo.server.api.ODataResponse;
+import org.apache.olingo.server.api.ODataServerError;
+import org.apache.olingo.server.api.ServiceMetadata;
+import org.apache.olingo.server.api.serializer.ODataSerializer;
+import org.apache.olingo.server.api.serializer.SerializerException;
+
+public class ErrorResponse extends ServiceResponse {
+  private ContentType contentType;
+  private ODataSerializer serializer;
+  
+  public ErrorResponse(ServiceMetadata metadata, ODataSerializer serializer,
+      ContentType contentType, ODataResponse response) {
+    super(metadata, response, new HashMap<String, String>());
+    this.contentType = contentType;
+    this.serializer = serializer;
+  }
+
+  @Override
+  public void accepts(ServiceResponseVisior visitor)
+      throws ODataLibraryException, ODataApplicationException {
+    visitor.visit(this);
+  }
+
+  public void writeError(ODataServerError error) {
+    try {
+      writeHeader(HttpHeader.CONTENT_TYPE, this.contentType.getType());
+      writeContent(this.serializer.error(error).getContent(), error.getStatusCode(), true);
+    } catch (SerializerException e) {
+      writeServerError(true);
+    }
+  } 
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/7a68ae68/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/MetadataResponse.java
----------------------------------------------------------------------
diff --git a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/MetadataResponse.java b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/MetadataResponse.java
index 5facd96..c030336 100644
--- a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/MetadataResponse.java
+++ b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/MetadataResponse.java
@@ -21,6 +21,7 @@ package org.apache.olingo.server.core.responses;
 import java.util.Map;
 
 import org.apache.olingo.commons.api.format.ContentType;
+import org.apache.olingo.commons.api.http.HttpHeader;
 import org.apache.olingo.server.api.ODataApplicationException;
 import org.apache.olingo.server.api.ODataResponse;
 import org.apache.olingo.server.api.ODataServerError;
@@ -63,6 +64,7 @@ public class MetadataResponse extends ServiceResponse {
   
   public void writeError(ODataServerError error) {
     try {
+      writeHeader(HttpHeader.CONTENT_TYPE, this.responseContentType.getType());
       writeContent(this.serializer.error(error).getContent(), error.getStatusCode(), true);
     } catch (SerializerException e) {
       writeServerError(true);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/7a68ae68/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/PropertyResponse.java
----------------------------------------------------------------------
diff --git a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/PropertyResponse.java b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/PropertyResponse.java
index 1fc5416..f9c35ba 100644
--- a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/PropertyResponse.java
+++ b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/PropertyResponse.java
@@ -27,6 +27,7 @@ import org.apache.olingo.commons.api.edm.EdmPrimitiveType;
 import org.apache.olingo.commons.api.edm.EdmType;
 import org.apache.olingo.commons.api.edm.constants.EdmTypeKind;
 import org.apache.olingo.commons.api.format.ContentType;
+import org.apache.olingo.commons.api.http.HttpHeader;
 import org.apache.olingo.commons.api.http.HttpStatusCode;
 import org.apache.olingo.server.api.ODataApplicationException;
 import org.apache.olingo.server.api.ODataResponse;
@@ -148,6 +149,7 @@ public class PropertyResponse extends ServiceResponse {
   
   public void writeError(ODataServerError error) {
     try {
+      writeHeader(HttpHeader.CONTENT_TYPE, this.responseContentType.getType());
       writeContent(this.serializer.error(error).getContent(), error.getStatusCode(), true);
     } catch (SerializerException e) {
       writeServerError(true);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/7a68ae68/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/ServiceDocumentResponse.java
----------------------------------------------------------------------
diff --git a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/ServiceDocumentResponse.java b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/ServiceDocumentResponse.java
index 0d7a88c..a4192e7 100644
--- a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/ServiceDocumentResponse.java
+++ b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/ServiceDocumentResponse.java
@@ -21,6 +21,7 @@ package org.apache.olingo.server.core.responses;
 import java.util.Map;
 
 import org.apache.olingo.commons.api.format.ContentType;
+import org.apache.olingo.commons.api.http.HttpHeader;
 import org.apache.olingo.server.api.ODataApplicationException;
 import org.apache.olingo.server.api.ODataResponse;
 import org.apache.olingo.server.api.ODataServerError;
@@ -64,6 +65,7 @@ public class ServiceDocumentResponse extends ServiceResponse {
   
   public void writeError(ODataServerError error) {
     try {
+      writeHeader(HttpHeader.CONTENT_TYPE, this.responseContentType.getType());
       writeContent(this.serializer.error(error).getContent(), error.getStatusCode(), true);
     } catch (SerializerException e) {
       writeServerError(true);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/7a68ae68/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/ServiceResponseVisior.java
----------------------------------------------------------------------
diff --git a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/ServiceResponseVisior.java b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/ServiceResponseVisior.java
index 5be8113..fb73b8c 100644
--- a/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/ServiceResponseVisior.java
+++ b/lib/server-core-ext/src/main/java/org/apache/olingo/server/core/responses/ServiceResponseVisior.java
@@ -67,4 +67,8 @@ public class ServiceResponseVisior {
       ODataApplicationException {
     response.writeServerError(true);
   }
+
+  public void visit(ErrorResponse response) {
+    response.writeServerError(true);
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/7a68ae68/lib/server-core-ext/src/test/java/org/apache/olingo/server/example/TripPinHandler.java
----------------------------------------------------------------------
diff --git a/lib/server-core-ext/src/test/java/org/apache/olingo/server/example/TripPinHandler.java b/lib/server-core-ext/src/test/java/org/apache/olingo/server/example/TripPinHandler.java
index fea02e9..4d2dbb9 100644
--- a/lib/server-core-ext/src/test/java/org/apache/olingo/server/example/TripPinHandler.java
+++ b/lib/server-core-ext/src/test/java/org/apache/olingo/server/example/TripPinHandler.java
@@ -40,9 +40,10 @@ import org.apache.olingo.commons.api.format.ContentType;
 import org.apache.olingo.commons.api.http.HttpMethod;
 import org.apache.olingo.server.api.OData;
 import org.apache.olingo.server.api.ODataApplicationException;
+import org.apache.olingo.server.api.ODataLibraryException;
 import org.apache.olingo.server.api.ODataRequest;
 import org.apache.olingo.server.api.ODataResponse;
-import org.apache.olingo.server.api.ODataLibraryException;
+import org.apache.olingo.server.api.ODataServerError;
 import org.apache.olingo.server.api.ServiceMetadata;
 import org.apache.olingo.server.api.uri.UriParameter;
 import org.apache.olingo.server.api.uri.UriResourceNavigation;
@@ -56,6 +57,7 @@ import org.apache.olingo.server.core.requests.ServiceDocumentRequest;
 import org.apache.olingo.server.core.responses.CountResponse;
 import org.apache.olingo.server.core.responses.EntityResponse;
 import org.apache.olingo.server.core.responses.EntitySetResponse;
+import org.apache.olingo.server.core.responses.ErrorResponse;
 import org.apache.olingo.server.core.responses.MetadataResponse;
 import org.apache.olingo.server.core.responses.NoContentResponse;
 import org.apache.olingo.server.core.responses.PrimitiveValueResponse;
@@ -561,4 +563,9 @@ public class TripPinHandler implements ServiceHandler {
   public boolean supportsDataIsolation() {
     return false;
   }
+  
+  @Override
+  public void processError(ODataServerError error, ErrorResponse response) {
+    response.writeError(error);
+  }
 }