This is an automated email from the ASF dual-hosted git repository.
jinwoo pushed a commit to branch support/1.15
in repository https://gitbox.apache.org/repos/asf/geode.git
The following commit(s) were added to refs/heads/support/1.15 by this push:
new 83eccd68f3 Unify web api exception return value specification to json.
(#7888)
83eccd68f3 is described below
commit 83eccd68f3c529483089c7d1c513e490a58afdba
Author: daidai <[email protected]>
AuthorDate: Fri Jul 25 11:44:12 2025 +0800
Unify web api exception return value specification to json. (#7888)
(cherry picked from commit c1ba95c93953d80e82768d5dce16dc3b3c373deb)
---
.../web/controllers/AbstractBaseController.java | 12 +++++++
.../web/controllers/BaseControllerAdvice.java | 37 +++++++++++-----------
.../web/controllers/PdxBasedCrudController.java | 14 +++++---
3 files changed, 40 insertions(+), 23 deletions(-)
diff --git
a/geode-web-api/src/main/java/org/apache/geode/rest/internal/web/controllers/AbstractBaseController.java
b/geode-web-api/src/main/java/org/apache/geode/rest/internal/web/controllers/AbstractBaseController.java
index 8a0d5b6461..d1ab4ecc60 100644
---
a/geode-web-api/src/main/java/org/apache/geode/rest/internal/web/controllers/AbstractBaseController.java
+++
b/geode-web-api/src/main/java/org/apache/geode/rest/internal/web/controllers/AbstractBaseController.java
@@ -765,6 +765,18 @@ public abstract class AbstractBaseController implements
InitializingBean {
return value;
}
+ public ResponseEntity<String> convertErrorAsJson(HttpStatus status, String
errorMessage) {
+ return ResponseEntity.status(status)
+ .contentType(APPLICATION_JSON_UTF8)
+ .body(convertErrorAsJson(errorMessage));
+ }
+
+ public ResponseEntity<String> convertErrorAsJson(HttpStatus status,
Throwable t) {
+ return ResponseEntity.status(status)
+ .contentType(APPLICATION_JSON_UTF8)
+ .body(convertErrorAsJson(t));
+ }
+
String convertErrorAsJson(String errorMessage) {
return ("{" + "\"cause\"" + ":" + "\"" + errorMessage + "\"" + "}");
}
diff --git
a/geode-web-api/src/main/java/org/apache/geode/rest/internal/web/controllers/BaseControllerAdvice.java
b/geode-web-api/src/main/java/org/apache/geode/rest/internal/web/controllers/BaseControllerAdvice.java
index e874e587b6..a7dcbcf8b4 100644
---
a/geode-web-api/src/main/java/org/apache/geode/rest/internal/web/controllers/BaseControllerAdvice.java
+++
b/geode-web-api/src/main/java/org/apache/geode/rest/internal/web/controllers/BaseControllerAdvice.java
@@ -19,6 +19,7 @@ import java.io.StringWriter;
import org.apache.logging.log4j.Logger;
import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.annotation.ControllerAdvice;
@@ -65,8 +66,8 @@ public class BaseControllerAdvice extends
AbstractBaseController {
@ExceptionHandler({RegionNotFoundException.class,
ResourceNotFoundException.class})
@ResponseBody
@ResponseStatus(HttpStatus.NOT_FOUND)
- public String handle(final RuntimeException e) {
- return convertErrorAsJson(e.getMessage());
+ public ResponseEntity<String> handle(final RuntimeException e) {
+ return convertErrorAsJson(HttpStatus.NOT_FOUND, e.getMessage());
}
/**
@@ -80,8 +81,8 @@ public class BaseControllerAdvice extends
AbstractBaseController {
@ExceptionHandler({MalformedJsonException.class})
@ResponseBody
@ResponseStatus(HttpStatus.BAD_REQUEST)
- public String handleException(final RuntimeException e) {
- return convertErrorAsJson(e.getMessage());
+ public ResponseEntity<String> handleException(final RuntimeException e) {
+ return convertErrorAsJson(HttpStatus.BAD_REQUEST, e.getMessage());
}
/**
@@ -95,8 +96,8 @@ public class BaseControllerAdvice extends
AbstractBaseController {
@ExceptionHandler(GemfireRestException.class)
@ResponseBody
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
- public String handleException(final GemfireRestException ge) {
- return convertErrorAsJson(ge);
+ public ResponseEntity<String> handleException(final GemfireRestException ge)
{
+ return convertErrorAsJson(HttpStatus.INTERNAL_SERVER_ERROR, ge);
}
/**
@@ -111,8 +112,8 @@ public class BaseControllerAdvice extends
AbstractBaseController {
@ExceptionHandler(DataTypeNotSupportedException.class)
@ResponseBody
@ResponseStatus(HttpStatus.NOT_ACCEPTABLE)
- public String handleException(final DataTypeNotSupportedException tns) {
- return convertErrorAsJson(tns.getMessage());
+ public ResponseEntity<String> handleException(final
DataTypeNotSupportedException tns) {
+ return convertErrorAsJson(HttpStatus.NOT_ACCEPTABLE, tns.getMessage());
}
/**
@@ -127,8 +128,8 @@ public class BaseControllerAdvice extends
AbstractBaseController {
@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
@ResponseBody
@ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)
- public String handleException(final HttpRequestMethodNotSupportedException
e) {
- return convertErrorAsJson(e.getMessage());
+ public ResponseEntity<String> handleException(final
HttpRequestMethodNotSupportedException e) {
+ return convertErrorAsJson(HttpStatus.METHOD_NOT_ALLOWED, e.getMessage());
}
/**
@@ -142,8 +143,8 @@ public class BaseControllerAdvice extends
AbstractBaseController {
@ExceptionHandler(AccessDeniedException.class)
@ResponseBody
@ResponseStatus(HttpStatus.FORBIDDEN)
- public String handleException(final AccessDeniedException cause) {
- return convertErrorAsJson(cause.getMessage());
+ public ResponseEntity<String> handleException(final AccessDeniedException
cause) {
+ return convertErrorAsJson(HttpStatus.FORBIDDEN, cause.getMessage());
}
/**
@@ -156,8 +157,8 @@ public class BaseControllerAdvice extends
AbstractBaseController {
@ExceptionHandler(NotAuthorizedException.class)
@ResponseBody
@ResponseStatus(HttpStatus.FORBIDDEN)
- public String handleException(final NotAuthorizedException cause) {
- return convertErrorAsJson(cause.getMessage());
+ public ResponseEntity<String> handleException(final NotAuthorizedException
cause) {
+ return convertErrorAsJson(HttpStatus.FORBIDDEN, cause.getMessage());
}
/**
@@ -170,8 +171,8 @@ public class BaseControllerAdvice extends
AbstractBaseController {
@ExceptionHandler(EntityNotFoundException.class)
@ResponseBody
@ResponseStatus(HttpStatus.NOT_FOUND)
- public String handleException(final EntityNotFoundException cause) {
- return convertErrorAsJson(cause.getMessage());
+ public ResponseEntity<String> handleException(final EntityNotFoundException
cause) {
+ return convertErrorAsJson(HttpStatus.NOT_FOUND, cause.getMessage());
}
/**
@@ -185,7 +186,7 @@ public class BaseControllerAdvice extends
AbstractBaseController {
@ExceptionHandler(Throwable.class)
@ResponseBody
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
- public String handleException(final Throwable cause) {
+ public ResponseEntity<String> handleException(final Throwable cause) {
final StringWriter stackTraceWriter = new StringWriter();
cause.printStackTrace(new PrintWriter(stackTraceWriter));
final String stackTrace = stackTraceWriter.toString();
@@ -194,7 +195,7 @@ public class BaseControllerAdvice extends
AbstractBaseController {
logger.debug(stackTrace);
}
- return convertErrorAsJson(cause.getMessage());
+ return convertErrorAsJson(HttpStatus.INTERNAL_SERVER_ERROR,
cause.getMessage());
}
}
diff --git
a/geode-web-api/src/main/java/org/apache/geode/rest/internal/web/controllers/PdxBasedCrudController.java
b/geode-web-api/src/main/java/org/apache/geode/rest/internal/web/controllers/PdxBasedCrudController.java
index 8cfa93c2f0..a153494d67 100644
---
a/geode-web-api/src/main/java/org/apache/geode/rest/internal/web/controllers/PdxBasedCrudController.java
+++
b/geode-web-api/src/main/java/org/apache/geode/rest/internal/web/controllers/PdxBasedCrudController.java
@@ -195,7 +195,7 @@ public class PdxBasedCrudController extends
CommonCrudController {
if (maxLimit < 0) {
String errorMessage =
String.format("Negative limit param (%1$s) is not valid!",
maxLimit);
- return new ResponseEntity<>(convertErrorAsJson(errorMessage),
HttpStatus.BAD_REQUEST);
+ return convertErrorAsJson(HttpStatus.BAD_REQUEST, errorMessage);
}
int mapSize = keys.size();
@@ -210,11 +210,12 @@ public class PdxBasedCrudController extends
CommonCrudController {
// limit param is not specified in proper format. set the HTTPHeader
// for BAD_REQUEST
String errorMessage = String.format("limit param (%1$s) is not
valid!", limit);
- return new ResponseEntity<>(convertErrorAsJson(errorMessage),
HttpStatus.BAD_REQUEST);
+ return convertErrorAsJson(HttpStatus.BAD_REQUEST, errorMessage);
}
}
headers.set(HttpHeaders.CONTENT_LOCATION, toUri(region,
keyList).toASCIIString());
+ headers.setContentType(APPLICATION_JSON_UTF8);
return new ResponseEntity<RegionData<?>>(data, headers, HttpStatus.OK);
}
@@ -248,6 +249,7 @@ public class PdxBasedCrudController extends
CommonCrudController {
logger.debug("Reading data for keys ({}) in Region ({})",
ArrayUtils.toString(keys), region);
securityService.authorize("READ", region, keys);
final HttpHeaders headers = new HttpHeaders();
+ headers.setContentType(APPLICATION_JSON_UTF8);
if (keys.length == 1) {
/* GET op on single key */
Object value = getValue(region, keys[0]);
@@ -277,7 +279,7 @@ public class PdxBasedCrudController extends
CommonCrudController {
String errorMessage = String.format(
"ignoreMissingKey param (%1$s) is not valid. valid usage is
ignoreMissingKey=true!",
ignoreMissingKey);
- return new ResponseEntity<>(convertErrorAsJson(errorMessage),
HttpStatus.BAD_REQUEST);
+ return convertErrorAsJson(HttpStatus.BAD_REQUEST, errorMessage);
}
final Map<Object, Object> valueObjs = getValues(region, keys);
@@ -365,17 +367,19 @@ public class PdxBasedCrudController extends
CommonCrudController {
String errorMessage = String.format(
"The op parameter (%1$s) is not valid. Valid values are PUT,
REPLACE, or CAS.",
opValue);
- return new ResponseEntity<>(convertErrorAsJson(errorMessage),
HttpStatus.BAD_REQUEST);
+ return convertErrorAsJson(HttpStatus.BAD_REQUEST, errorMessage);
}
if (keys.length > 1) {
updateMultipleKeys(region, keys, json);
HttpHeaders headers = new HttpHeaders();
+ headers.setContentType(APPLICATION_JSON_UTF8);
headers.setLocation(toUri(region,
StringUtils.arrayToCommaDelimitedString(keys)));
return new ResponseEntity<>(headers, HttpStatus.OK);
} else {
// put case
Object existingValue = updateSingleKey(region, keys[0], json, opValue);
final HttpHeaders headers = new HttpHeaders();
+ headers.setContentType(APPLICATION_JSON_UTF8);
headers.setLocation(toUri(region, keys[0]));
return new ResponseEntity<>(existingValue, headers,
(existingValue == null ? HttpStatus.OK : HttpStatus.CONFLICT));
@@ -433,7 +437,7 @@ public class PdxBasedCrudController extends
CommonCrudController {
String errorMessage = String.format(
"The op parameter (%1$s) is not valid. Valid values are PUT, CREATE,
REPLACE, or CAS.",
opValue);
- return new ResponseEntity<>(convertErrorAsJson(errorMessage),
HttpStatus.BAD_REQUEST);
+ return convertErrorAsJson(HttpStatus.BAD_REQUEST, errorMessage);
}
if (decodedKeys.length > 1) {