Difference between revisions of "GxRest/GxJRS/Responses"

From Gcube Wiki
Jump to: navigation, search
(Thrown the CodeException)
(Thrown the CodeException)
Line 51: Line 51:
 
The following method tries to create a Context given certain parameters (not shown).
 
The following method tries to create a Context given certain parameters (not shown).
  
<pre>
+
<source lang="Java">
 
import javax.ws.rs.core.Response;
 
import javax.ws.rs.core.Response;
 
import org.gcube.resourcemanagement.manager.io.rs.RMCode;
 
import org.gcube.resourcemanagement.manager.io.rs.RMCode;
Line 58: Line 58:
 
public Response create(...) {
 
public Response create(...) {
  
   // Error condition occurs
+
   //An error condition occurs
 
   throw new WebCodeException(RMCode.CONTEXT_ALREADY_EXIST));
 
   throw new WebCodeException(RMCode.CONTEXT_ALREADY_EXIST));
  
   // Another error condition occurs
+
   //Another error condition occurs
 
   throw new WebCodeException(RMCode.CONTEXT_PARENT_DOES_NOT_EXIST));
 
   throw new WebCodeException(RMCode.CONTEXT_PARENT_DOES_NOT_EXIST));
 
}
 
}
</pre>
+
</source>
  
 
Do note that WebCodeExceptions can be thrown in any object invoked by create without the need of declaring them (this is because they are RuntimeExceptions too).
 
Do note that WebCodeExceptions can be thrown in any object invoked by create without the need of declaring them (this is because they are RuntimeExceptions too).

Revision as of 17:39, 4 January 2018

What are Code Exceptions

Code Exceptions model an approach to simplify and uniform the handling of exceptions (in the Java sense) within a RESTful or REST-like services. Instead of creating separate classes for each exception type, the idea behind CodeException is to use a single, system-wide exception class. And make it extend WebApplicationException (from javax.ws.rs) that in turn extends RuntimeException.

Major advantages of CodeException are:

  • abstract over the response returned by a REST resource method
  • provide a single (and self-documented) point where to declare error codes and messages returned by the webapp
  • reduce the class count in a project (not to mention in a system)
  • simplify the method declaration (RuntimeExceptions do not need to be declared)
  • simplify the client code that manages only the error codes it is capable to handle
  • remove the need to declare exceptions that sometimes aren’t going to be handled anyway.

Sample Usage

The following code snippets are extracted from the new Resource Manager service.

Declare your Error Codes

The first step is to declare an enumeration of the error codes and associated messages. The enum must extend the ErrorCode<code> interface.

import org.gcube.resourcemanagement.manager.io.exceptions.ErrorCode;

public enum RMCode implements ErrorCode {

	INVALID_METHOD__REQUEST(0, "The request is invalid."), 
	MISSING_PARAMETER(1,"Required query parameter is missing."), 
	MISSING_HEADER(2, "Required header is missing."), 
	CONTEXT_ALREADY_EXIST(3, "Context already exists at the same level of the hierarchy."),
	CONTEXT_PARENT_DOES_NOT_EXIST(4, "Failed to validate the request. The request was not submitted to the Resource Registry."),
	INVALID_REQUEST_FOR_RR(5, "Failed to validate the request. The request was not submitted to the Resource Registry."),
	GENERIC_ERROR_FROM_RR(6, "The Resource Registry returned an error.");

	private int id;
	private String msg;
		
	private RMCode(int id, String msg) {
		this.id = id;
		this.msg = msg;
	}

	public int getId() {
		return this.id;
	}

	public String getMessage() {
		return this.msg;
	}
}

Thrown the CodeException

The following method tries to create a Context given certain parameters (not shown).

import javax.ws.rs.core.Response;
import org.gcube.resourcemanagement.manager.io.rs.RMCode;
import org.gcube.resourcemanagement.manager.io.exceptions.WebCodeException;
 
public Response create(...) {
 
  //An error condition occurs
  throw new WebCodeException(RMCode.CONTEXT_ALREADY_EXIST));
 
  //Another error condition occurs
  throw new WebCodeException(RMCode.CONTEXT_PARENT_DOES_NOT_EXIST));
}

Do note that WebCodeExceptions can be thrown in any object invoked by create without the need of declaring them (this is because they are RuntimeExceptions too).