This is an automated email from the ASF dual-hosted git repository.
jerryshao pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino.git
The following commit(s) were added to refs/heads/main by this push:
new 29a566bc6f [#12788] fix(server): reject null request body before
validate() in create/register/add operations (#12791)
29a566bc6f is described below
commit 29a566bc6f1d7c0384dfbf9881c968440c48e2be
Author: Fayupable <[email protected]>
AuthorDate: Wed Sep 2 11:39:27 2026 +0300
[#12788] fix(server): reject null request body before validate() in
create/register/add operations (#12791)
### What changes were proposed in this pull request?
Several `create`/`register`/`add` REST operations called
`request.validate()` without first checking for a null request body, so
an empty or JSON `null` body dereferenced the request and returned HTTP
500 instead of a proper 400. Applied the existing `createMetalake`
pattern (null-check first, then route an `IllegalArgumentException`
through the corresponding exception handler) to:
- Catalog, Schema, Table, Fileset, Topic, Policy, and Tag creation
- Function, Model, and JobTemplate registration
- User, Group, and Role creation
- Bulk user and group creation
Also updated a pre-existing test in `TestGroupOperations` that had
asserted the old 500 status as expected behavior, and added a
`WithNullRequest` test for each fixed operation, matching the
`assertNullRequestBodyRejected` pattern from #12770.
### Why are the changes needed?
A null request body currently returns HTTP 500 with an internal error
response for these operations, instead of a structured 400. This is
inconsistent with the already-fixed `alter`/`createView` operations
(#12769, #12770) and with `createMetalake`, and it leaks an internal
error to the caller for what is really a bad request.
Fix: #12788
### Does this PR introduce _any_ user-facing change?
Yes. A `create`/`register`/`add` request with a null or empty body now
returns HTTP 400 with error code `1001`, error type
`IllegalArgumentException`, and a message stating the request body
cannot be null, instead of HTTP 500.
### How was this patch tested?
Added a `testXxxWithNullRequest()` test for each of the 14 fixed
operations, verifying HTTP 400, error code `1001`, error type
`IllegalArgumentException`, and the error message, using the shared
`assertNullRequestBodyRejected` helper. Ran `:server:test` scoped to the
14 affected test classes: 176 tests, all passing.
---
.../gravitino/server/web/rest/BulkOperations.java | 16 ++++++++++++++++
.../server/web/rest/CatalogOperations.java | 11 ++++++++++-
.../server/web/rest/FilesetOperations.java | 11 ++++++++++-
.../server/web/rest/FunctionOperations.java | 11 ++++++++++-
.../gravitino/server/web/rest/GroupOperations.java | 11 ++++++++++-
.../gravitino/server/web/rest/JobOperations.java | 11 ++++++++++-
.../gravitino/server/web/rest/ModelOperations.java | 11 ++++++++++-
.../server/web/rest/PolicyOperations.java | 11 ++++++++++-
.../gravitino/server/web/rest/RoleOperations.java | 11 ++++++++++-
.../server/web/rest/SchemaOperations.java | 11 ++++++++++-
.../gravitino/server/web/rest/TableOperations.java | 11 ++++++++++-
.../gravitino/server/web/rest/TagOperations.java | 11 ++++++++++-
.../gravitino/server/web/rest/TopicOperations.java | 11 ++++++++++-
.../gravitino/server/web/rest/UserOperations.java | 11 ++++++++++-
.../server/web/rest/TestBulkOperations.java | 22 ++++++++++++++++++++++
.../server/web/rest/TestCatalogOperations.java | 11 +++++++++++
.../server/web/rest/TestFilesetOperations.java | 11 +++++++++++
.../server/web/rest/TestFunctionOperations.java | 11 +++++++++++
.../server/web/rest/TestGroupOperations.java | 15 ++++++++++++---
.../server/web/rest/TestJobOperations.java | 16 ++++++++++++++++
.../server/web/rest/TestModelOperations.java | 11 +++++++++++
.../server/web/rest/TestPolicyOperations.java | 11 +++++++++++
.../server/web/rest/TestRoleOperations.java | 11 +++++++++++
.../server/web/rest/TestSchemaOperations.java | 11 +++++++++++
.../server/web/rest/TestTableOperations.java | 11 +++++++++++
.../server/web/rest/TestTagOperations.java | 11 +++++++++++
.../server/web/rest/TestTopicOperations.java | 11 +++++++++++
.../server/web/rest/TestUserOperations.java | 11 +++++++++++
28 files changed, 317 insertions(+), 16 deletions(-)
diff --git
a/server/src/main/java/org/apache/gravitino/server/web/rest/BulkOperations.java
b/server/src/main/java/org/apache/gravitino/server/web/rest/BulkOperations.java
index d8e73d1750..779b463dde 100644
---
a/server/src/main/java/org/apache/gravitino/server/web/rest/BulkOperations.java
+++
b/server/src/main/java/org/apache/gravitino/server/web/rest/BulkOperations.java
@@ -101,6 +101,14 @@ public class BulkOperations {
@PathParam("metalake") @AuthorizationMetadata(type =
Entity.EntityType.METALAKE)
String metalake,
BulkUserAddRequest request) {
+ if (request == null) {
+ return ExceptionHandlers.handleUserException(
+ OperationType.ADD,
+ "",
+ metalake,
+ new IllegalArgumentException("Request body cannot be null"));
+ }
+
try {
return Utils.doAs(
httpRequest,
@@ -202,6 +210,14 @@ public class BulkOperations {
@PathParam("metalake") @AuthorizationMetadata(type =
Entity.EntityType.METALAKE)
String metalake,
BulkGroupAddRequest request) {
+ if (request == null) {
+ return ExceptionHandlers.handleGroupException(
+ OperationType.ADD,
+ "",
+ metalake,
+ new IllegalArgumentException("Request body cannot be null"));
+ }
+
try {
return Utils.doAs(
httpRequest,
diff --git
a/server/src/main/java/org/apache/gravitino/server/web/rest/CatalogOperations.java
b/server/src/main/java/org/apache/gravitino/server/web/rest/CatalogOperations.java
index 4b5b354f16..ea5d99cdbd 100644
---
a/server/src/main/java/org/apache/gravitino/server/web/rest/CatalogOperations.java
+++
b/server/src/main/java/org/apache/gravitino/server/web/rest/CatalogOperations.java
@@ -143,7 +143,16 @@ public class CatalogOperations {
@PathParam("metalake") @AuthorizationMetadata(type =
Entity.EntityType.METALAKE)
String metalake,
CatalogCreateRequest request) {
- String catalogName = request == null ? "" : request.getName();
+ if (request == null) {
+ LOG.warn("Received create catalog request with null request body");
+ return ExceptionHandlers.handleCatalogException(
+ OperationType.CREATE,
+ "",
+ metalake,
+ new IllegalArgumentException("Request body cannot be null"));
+ }
+
+ String catalogName = request.getName();
LOG.info("Received create catalog request for metalake: {}", metalake);
try {
return Utils.doAs(
diff --git
a/server/src/main/java/org/apache/gravitino/server/web/rest/FilesetOperations.java
b/server/src/main/java/org/apache/gravitino/server/web/rest/FilesetOperations.java
index 40ba231c54..52a5b06400 100644
---
a/server/src/main/java/org/apache/gravitino/server/web/rest/FilesetOperations.java
+++
b/server/src/main/java/org/apache/gravitino/server/web/rest/FilesetOperations.java
@@ -146,7 +146,16 @@ public class FilesetOperations {
@PathParam("catalog") @AuthorizationMetadata(type =
Entity.EntityType.CATALOG) String catalog,
@PathParam("schema") @AuthorizationMetadata(type =
Entity.EntityType.SCHEMA) String schema,
FilesetCreateRequest request) {
- String filesetName = request == null ? "" : request.getName();
+ if (request == null) {
+ LOG.warn("Received create fileset request with null request body");
+ return ExceptionHandlers.handleFilesetException(
+ OperationType.CREATE,
+ "",
+ schema,
+ new IllegalArgumentException("Request body cannot be null"));
+ }
+
+ String filesetName = request.getName();
LOG.info(
"Received create fileset request: {}.{}.{}.{}", metalake, catalog,
schema, filesetName);
try {
diff --git
a/server/src/main/java/org/apache/gravitino/server/web/rest/FunctionOperations.java
b/server/src/main/java/org/apache/gravitino/server/web/rest/FunctionOperations.java
index 085f09d4ad..93627ad6fa 100644
---
a/server/src/main/java/org/apache/gravitino/server/web/rest/FunctionOperations.java
+++
b/server/src/main/java/org/apache/gravitino/server/web/rest/FunctionOperations.java
@@ -160,7 +160,16 @@ public class FunctionOperations {
@PathParam("catalog") @AuthorizationMetadata(type =
Entity.EntityType.CATALOG) String catalog,
@PathParam("schema") @AuthorizationMetadata(type =
Entity.EntityType.SCHEMA) String schema,
FunctionRegisterRequest request) {
- String functionName = request == null ? "" : request.getName();
+ if (request == null) {
+ LOG.warn("Received register function request with null request body");
+ return ExceptionHandlers.handleFunctionException(
+ OperationType.REGISTER,
+ "",
+ schema,
+ new IllegalArgumentException("Request body cannot be null"));
+ }
+
+ String functionName = request.getName();
LOG.info(
"Received register function request: {}.{}.{}.{}", metalake, catalog,
schema, functionName);
try {
diff --git
a/server/src/main/java/org/apache/gravitino/server/web/rest/GroupOperations.java
b/server/src/main/java/org/apache/gravitino/server/web/rest/GroupOperations.java
index 9164bf414e..3e1ec2b643 100644
---
a/server/src/main/java/org/apache/gravitino/server/web/rest/GroupOperations.java
+++
b/server/src/main/java/org/apache/gravitino/server/web/rest/GroupOperations.java
@@ -113,7 +113,16 @@ public class GroupOperations {
@PathParam("metalake") @AuthorizationMetadata(type =
Entity.EntityType.METALAKE)
String metalake,
GroupAddRequest request) {
- String groupName = request == null ? "" : request.getName();
+ if (request == null) {
+ LOG.warn("Received add group request with null request body");
+ return ExceptionHandlers.handleGroupException(
+ OperationType.ADD,
+ "",
+ metalake,
+ new IllegalArgumentException("Request body cannot be null"));
+ }
+
+ String groupName = request.getName();
try {
return Utils.doAs(
httpRequest,
diff --git
a/server/src/main/java/org/apache/gravitino/server/web/rest/JobOperations.java
b/server/src/main/java/org/apache/gravitino/server/web/rest/JobOperations.java
index ded98a34b4..ec1e989c83 100644
---
a/server/src/main/java/org/apache/gravitino/server/web/rest/JobOperations.java
+++
b/server/src/main/java/org/apache/gravitino/server/web/rest/JobOperations.java
@@ -158,8 +158,17 @@ public class JobOperations {
@PathParam("metalake") @AuthorizationMetadata(type =
Entity.EntityType.METALAKE)
String metalake,
JobTemplateRegisterRequest request) {
+ if (request == null) {
+ LOG.warn("Received register job template request with null request
body");
+ return ExceptionHandlers.handleJobTemplateException(
+ OperationType.REGISTER,
+ "",
+ metalake,
+ new IllegalArgumentException("Request body cannot be null"));
+ }
+
String jobTemplateName =
- request == null || request.getJobTemplate() == null ? "" :
request.getJobTemplate().name();
+ request.getJobTemplate() == null ? "" :
request.getJobTemplate().name();
LOG.info(
"Received request to register job template {} in metalake: {}",
jobTemplateName, metalake);
diff --git
a/server/src/main/java/org/apache/gravitino/server/web/rest/ModelOperations.java
b/server/src/main/java/org/apache/gravitino/server/web/rest/ModelOperations.java
index 7c0bda83d0..446bdf5545 100644
---
a/server/src/main/java/org/apache/gravitino/server/web/rest/ModelOperations.java
+++
b/server/src/main/java/org/apache/gravitino/server/web/rest/ModelOperations.java
@@ -172,7 +172,16 @@ public class ModelOperations {
@PathParam("catalog") @AuthorizationMetadata(type =
Entity.EntityType.CATALOG) String catalog,
@PathParam("schema") @AuthorizationMetadata(type =
Entity.EntityType.SCHEMA) String schema,
ModelRegisterRequest request) {
- String modelName = request == null ? "" : request.getName();
+ if (request == null) {
+ LOG.warn("Received register model request with null request body");
+ return ExceptionHandlers.handleModelException(
+ OperationType.REGISTER,
+ "",
+ schema,
+ new IllegalArgumentException("Request body cannot be null"));
+ }
+
+ String modelName = request.getName();
LOG.info("Received register model request: {}.{}.{}.{}", metalake,
catalog, schema, modelName);
try {
diff --git
a/server/src/main/java/org/apache/gravitino/server/web/rest/PolicyOperations.java
b/server/src/main/java/org/apache/gravitino/server/web/rest/PolicyOperations.java
index 1b4102ec1b..ec336b74ae 100644
---
a/server/src/main/java/org/apache/gravitino/server/web/rest/PolicyOperations.java
+++
b/server/src/main/java/org/apache/gravitino/server/web/rest/PolicyOperations.java
@@ -141,7 +141,16 @@ public class PolicyOperations {
@PathParam("metalake") @AuthorizationMetadata(type =
Entity.EntityType.METALAKE)
String metalake,
PolicyCreateRequest request) {
- String policyName = request == null ? "" : request.getName();
+ if (request == null) {
+ LOG.warn("Received create policy request with null request body");
+ return ExceptionHandlers.handlePolicyException(
+ OperationType.CREATE,
+ "",
+ metalake,
+ new IllegalArgumentException("Request body cannot be null"));
+ }
+
+ String policyName = request.getName();
LOG.info("Received create policy request under metalake: {}", metalake);
try {
diff --git
a/server/src/main/java/org/apache/gravitino/server/web/rest/RoleOperations.java
b/server/src/main/java/org/apache/gravitino/server/web/rest/RoleOperations.java
index c6a60b1b65..37a81ba8b9 100644
---
a/server/src/main/java/org/apache/gravitino/server/web/rest/RoleOperations.java
+++
b/server/src/main/java/org/apache/gravitino/server/web/rest/RoleOperations.java
@@ -140,7 +140,16 @@ public class RoleOperations {
@PathParam("metalake") @AuthorizationMetadata(type =
Entity.EntityType.METALAKE)
String metalake,
RoleCreateRequest request) {
- String roleName = request == null ? "" : request.getName();
+ if (request == null) {
+ LOG.warn("Received create role request with null request body");
+ return ExceptionHandlers.handleRoleException(
+ OperationType.CREATE,
+ "",
+ metalake,
+ new IllegalArgumentException("Request body cannot be null"));
+ }
+
+ String roleName = request.getName();
try {
return Utils.doAs(
diff --git
a/server/src/main/java/org/apache/gravitino/server/web/rest/SchemaOperations.java
b/server/src/main/java/org/apache/gravitino/server/web/rest/SchemaOperations.java
index 8203568728..19ec02bb67 100644
---
a/server/src/main/java/org/apache/gravitino/server/web/rest/SchemaOperations.java
+++
b/server/src/main/java/org/apache/gravitino/server/web/rest/SchemaOperations.java
@@ -143,7 +143,16 @@ public class SchemaOperations {
@PathParam("catalog") @AuthorizationMetadata(type =
Entity.EntityType.CATALOG) String catalog,
@AuthorizationRequest(type =
AuthorizationRequest.RequestType.CREATE_SCHEMA)
SchemaCreateRequest request) {
- String schemaName = request == null ? "" : request.getName();
+ if (request == null) {
+ LOG.warn("Received create schema request with null request body");
+ return ExceptionHandlers.handleSchemaException(
+ OperationType.CREATE,
+ "",
+ catalog,
+ new IllegalArgumentException("Request body cannot be null"));
+ }
+
+ String schemaName = request.getName();
LOG.info("Received create schema request: {}.{}.{}", metalake, catalog,
schemaName);
try {
return Utils.doAs(
diff --git
a/server/src/main/java/org/apache/gravitino/server/web/rest/TableOperations.java
b/server/src/main/java/org/apache/gravitino/server/web/rest/TableOperations.java
index 2525f08f65..1b0eb4d90c 100644
---
a/server/src/main/java/org/apache/gravitino/server/web/rest/TableOperations.java
+++
b/server/src/main/java/org/apache/gravitino/server/web/rest/TableOperations.java
@@ -129,7 +129,16 @@ public class TableOperations {
@PathParam("catalog") @AuthorizationMetadata(type =
Entity.EntityType.CATALOG) String catalog,
@PathParam("schema") @AuthorizationMetadata(type =
Entity.EntityType.SCHEMA) String schema,
TableCreateRequest request) {
- String tableName = request == null ? "" : request.getName();
+ if (request == null) {
+ LOG.warn("Received create table request with null request body");
+ return ExceptionHandlers.handleTableException(
+ OperationType.CREATE,
+ "",
+ schema,
+ new IllegalArgumentException("Request body cannot be null"));
+ }
+
+ String tableName = request.getName();
LOG.info("Received create table request: {}.{}.{}.{}", metalake, catalog,
schema, tableName);
try {
return Utils.doAs(
diff --git
a/server/src/main/java/org/apache/gravitino/server/web/rest/TagOperations.java
b/server/src/main/java/org/apache/gravitino/server/web/rest/TagOperations.java
index 12d2866214..8c0427a43e 100644
---
a/server/src/main/java/org/apache/gravitino/server/web/rest/TagOperations.java
+++
b/server/src/main/java/org/apache/gravitino/server/web/rest/TagOperations.java
@@ -151,7 +151,16 @@ public class TagOperations {
@PathParam("metalake") @AuthorizationMetadata(type =
Entity.EntityType.METALAKE)
String metalake,
TagCreateRequest request) {
- String tagName = request == null ? "" : request.getName();
+ if (request == null) {
+ LOG.warn("Received create tag request with null request body");
+ return ExceptionHandlers.handleTagException(
+ OperationType.CREATE,
+ "",
+ metalake,
+ new IllegalArgumentException("Request body cannot be null"));
+ }
+
+ String tagName = request.getName();
LOG.info("Received create tag request under metalake: {}", metalake);
try {
diff --git
a/server/src/main/java/org/apache/gravitino/server/web/rest/TopicOperations.java
b/server/src/main/java/org/apache/gravitino/server/web/rest/TopicOperations.java
index cbf59711b0..cdcb5230e2 100644
---
a/server/src/main/java/org/apache/gravitino/server/web/rest/TopicOperations.java
+++
b/server/src/main/java/org/apache/gravitino/server/web/rest/TopicOperations.java
@@ -124,7 +124,16 @@ public class TopicOperations {
@PathParam("catalog") @AuthorizationMetadata(type =
Entity.EntityType.CATALOG) String catalog,
@PathParam("schema") @AuthorizationMetadata(type =
Entity.EntityType.SCHEMA) String schema,
TopicCreateRequest request) {
- String topicName = request == null ? "" : request.getName();
+ if (request == null) {
+ LOG.warn("Received create topic request with null request body");
+ return ExceptionHandlers.handleTopicException(
+ OperationType.CREATE,
+ "",
+ schema,
+ new IllegalArgumentException("Request body cannot be null"));
+ }
+
+ String topicName = request.getName();
LOG.info("Received create topic request: {}.{}.{}", metalake, catalog,
schema);
try {
return Utils.doAs(
diff --git
a/server/src/main/java/org/apache/gravitino/server/web/rest/UserOperations.java
b/server/src/main/java/org/apache/gravitino/server/web/rest/UserOperations.java
index a984b469d7..9a8039c5c1 100644
---
a/server/src/main/java/org/apache/gravitino/server/web/rest/UserOperations.java
+++
b/server/src/main/java/org/apache/gravitino/server/web/rest/UserOperations.java
@@ -155,7 +155,16 @@ public class UserOperations {
@PathParam("metalake") @AuthorizationMetadata(type =
Entity.EntityType.METALAKE)
String metalake,
UserAddRequest request) {
- String userName = request == null ? "" : request.getName();
+ if (request == null) {
+ LOG.warn("Received add user request with null request body");
+ return ExceptionHandlers.handleUserException(
+ OperationType.ADD,
+ "",
+ metalake,
+ new IllegalArgumentException("Request body cannot be null"));
+ }
+
+ String userName = request.getName();
try {
return Utils.doAs(
httpRequest,
diff --git
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestBulkOperations.java
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestBulkOperations.java
index 7a01a4cbb6..1d843b4728 100644
---
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestBulkOperations.java
+++
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestBulkOperations.java
@@ -159,6 +159,17 @@ public class TestBulkOperations extends BaseOperationsTest
{
return resourceConfig;
}
+ @Test
+ public void testBulkAddUsersWithNullRequest() {
+ Response resp =
+ target("/bulk/metalakes/metalake1/users/add")
+ .request(MediaType.APPLICATION_JSON_TYPE)
+ .accept("application/vnd.gravitino.v1+json")
+ .post(Entity.entity(new byte[0], MediaType.APPLICATION_JSON_TYPE));
+
+ assertNullRequestBodyRejected(resp);
+ }
+
@Test
public void testBulkAddUsersBestEffort() {
User user1 = buildUser("user1");
@@ -224,6 +235,17 @@ public class TestBulkOperations extends BaseOperationsTest
{
Assertions.assertEquals(ErrorConstants.NOT_FOUND_CODE,
bulkResponse.getErrors()[0].getCode());
}
+ @Test
+ public void testBulkAddGroupsWithNullRequest() {
+ Response resp =
+ target("/bulk/metalakes/metalake1/groups/add")
+ .request(MediaType.APPLICATION_JSON_TYPE)
+ .accept("application/vnd.gravitino.v1+json")
+ .post(Entity.entity(new byte[0], MediaType.APPLICATION_JSON_TYPE));
+
+ assertNullRequestBodyRejected(resp);
+ }
+
@Test
public void testBulkAddGroupsBestEffort() {
Group group1 = buildGroup("group1");
diff --git
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestCatalogOperations.java
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestCatalogOperations.java
index b56d7c1378..ebbc7a52a1 100644
---
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestCatalogOperations.java
+++
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestCatalogOperations.java
@@ -221,6 +221,17 @@ public class TestCatalogOperations extends
BaseOperationsTest {
Assertions.assertEquals(NoSuchMetalakeException.class.getSimpleName(),
errorResponse.getType());
}
+ @Test
+ public void testCreateCatalogWithNullRequest() {
+ Response resp =
+ target("/metalakes/metalake1/catalogs")
+ .request(MediaType.APPLICATION_JSON_TYPE)
+ .accept("application/vnd.gravitino.v1+json")
+ .post(Entity.entity(new byte[0], MediaType.APPLICATION_JSON_TYPE));
+
+ assertNullRequestBodyRejected(resp);
+ }
+
@Test
public void testCreateCatalog() {
CatalogCreateRequest req =
diff --git
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestFilesetOperations.java
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestFilesetOperations.java
index 76f7658c31..8d286f2420 100644
---
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestFilesetOperations.java
+++
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestFilesetOperations.java
@@ -243,6 +243,17 @@ public class TestFilesetOperations extends
BaseOperationsTest {
Assertions.assertEquals(RuntimeException.class.getSimpleName(),
errorResp2.getType());
}
+ @Test
+ public void testCreateFilesetWithNullRequest() {
+ Response resp =
+ target(filesetPath(metalake, catalog, schema))
+ .request(MediaType.APPLICATION_JSON_TYPE)
+ .accept("application/vnd.gravitino.v1+json")
+ .post(Entity.entity(new byte[0], MediaType.APPLICATION_JSON_TYPE));
+
+ assertNullRequestBodyRejected(resp);
+ }
+
@Test
public void testCreateFileset() {
Fileset fileset =
diff --git
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestFunctionOperations.java
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestFunctionOperations.java
index 5aad775be8..820874e935 100644
---
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestFunctionOperations.java
+++
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestFunctionOperations.java
@@ -266,6 +266,17 @@ public class TestFunctionOperations extends
BaseOperationsTest {
Assertions.assertEquals(RuntimeException.class.getSimpleName(),
errorResp1.getType());
}
+ @Test
+ public void testRegisterFunctionWithNullRequest() {
+ Response resp =
+ target(functionPath())
+ .request(MediaType.APPLICATION_JSON_TYPE)
+ .accept("application/vnd.gravitino.v1+json")
+ .post(Entity.entity(new byte[0], MediaType.APPLICATION_JSON_TYPE));
+
+ assertNullRequestBodyRejected(resp);
+ }
+
@Test
public void testRegisterScalarFunction() {
NameIdentifier funcId = NameIdentifierUtil.ofFunction(metalake, catalog,
schema, "func1");
diff --git
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestGroupOperations.java
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestGroupOperations.java
index 1bcf6deaa5..a632578efe 100644
---
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestGroupOperations.java
+++
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestGroupOperations.java
@@ -122,6 +122,17 @@ public class TestGroupOperations extends
BaseOperationsTest {
return resourceConfig;
}
+ @Test
+ public void testAddGroupWithNullRequest() {
+ Response resp =
+ target("/metalakes/metalake1/groups")
+ .request(MediaType.APPLICATION_JSON_TYPE)
+ .accept("application/vnd.gravitino.v1+json")
+ .post(Entity.entity(new byte[0], MediaType.APPLICATION_JSON_TYPE));
+
+ assertNullRequestBodyRejected(resp);
+ }
+
@Test
public void testAddGroup() throws IOException {
GroupAddRequest req = new GroupAddRequest("group1");
@@ -221,9 +232,7 @@ public class TestGroupOperations extends BaseOperationsTest
{
.accept("application/vnd.gravitino.v1+json")
.post(Entity.entity("null", MediaType.APPLICATION_JSON_TYPE));
- Assertions.assertEquals(Status.INTERNAL_SERVER_ERROR.getStatusCode(),
resp.getStatus());
- ErrorResponse error = resp.readEntity(ErrorResponse.class);
- Assertions.assertNotEquals(NullPointerException.class.getSimpleName(),
error.getType());
+ assertNullRequestBodyRejected(resp);
}
@Test
diff --git
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestJobOperations.java
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestJobOperations.java
index e39cafa70c..478192cecb 100644
---
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestJobOperations.java
+++
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestJobOperations.java
@@ -241,6 +241,22 @@ public class TestJobOperations extends JerseyTest {
Assertions.assertEquals(RuntimeException.class.getSimpleName(),
errorResp3.getType());
}
+ @Test
+ public void testRegisterJobTemplateWithNullRequest() {
+ Response resp =
+ target(jobTemplatePath())
+ .request(APPLICATION_JSON_TYPE)
+ .accept("application/vnd.gravitino.v1+json")
+ .post(Entity.entity(new byte[0], APPLICATION_JSON_TYPE));
+
+ Assertions.assertEquals(Response.Status.BAD_REQUEST.getStatusCode(),
resp.getStatus());
+ ErrorResponse errorResponse = resp.readEntity(ErrorResponse.class);
+ Assertions.assertEquals(ErrorConstants.ILLEGAL_ARGUMENTS_CODE,
errorResponse.getCode());
+ Assertions.assertEquals(
+ IllegalArgumentException.class.getSimpleName(),
errorResponse.getType());
+ Assertions.assertTrue(errorResponse.getMessage().contains("Request body
cannot be null"));
+ }
+
@Test
public void testRegisterJobTemplate() {
JobTemplateEntity template =
diff --git
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestModelOperations.java
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestModelOperations.java
index 5f26d8e9d1..e69ec2a0b2 100644
---
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestModelOperations.java
+++
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestModelOperations.java
@@ -310,6 +310,17 @@ public class TestModelOperations extends
BaseOperationsTest {
assertNullRequestBodyRejected(alterVersionByAliasResponse);
}
+ @Test
+ public void testRegisterModelWithNullRequest() {
+ Response resp =
+ target(modelPath())
+ .request(MediaType.APPLICATION_JSON_TYPE)
+ .accept("application/vnd.gravitino.v1+json")
+ .post(Entity.entity(new byte[0], MediaType.APPLICATION_JSON_TYPE));
+
+ assertNullRequestBodyRejected(resp);
+ }
+
@Test
public void testRegisterModel() {
NameIdentifier modelId = NameIdentifierUtil.ofModel(metalake, catalog,
schema, "model1");
diff --git
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestPolicyOperations.java
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestPolicyOperations.java
index 382e1f9d8b..3095512cac 100644
---
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestPolicyOperations.java
+++
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestPolicyOperations.java
@@ -265,6 +265,17 @@ public class TestPolicyOperations extends
BaseOperationsTest {
Assertions.assertEquals(0, policyListResp2.getPolicies().length);
}
+ @Test
+ public void testCreatePolicyWithNullRequest() {
+ Response resp =
+ target(policyPath(metalake))
+ .request(MediaType.APPLICATION_JSON_TYPE)
+ .accept("application/vnd.gravitino.v1+json")
+ .post(Entity.entity(new byte[0], MediaType.APPLICATION_JSON_TYPE));
+
+ assertNullRequestBodyRejected(resp);
+ }
+
@Test
public void testCreatePolicy() {
ImmutableMap<String, Object> contentFields =
ImmutableMap.of("target_file_size_bytes", 1000);
diff --git
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestRoleOperations.java
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestRoleOperations.java
index e22a10c616..b0111d1276 100644
---
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestRoleOperations.java
+++
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestRoleOperations.java
@@ -148,6 +148,17 @@ public class TestRoleOperations extends BaseOperationsTest
{
return resourceConfig;
}
+ @Test
+ public void testCreateRoleWithNullRequest() {
+ Response resp =
+ target("/metalakes/metalake1/roles")
+ .request(MediaType.APPLICATION_JSON_TYPE)
+ .accept("application/vnd.gravitino.v1+json")
+ .post(Entity.entity(new byte[0], MediaType.APPLICATION_JSON_TYPE));
+
+ assertNullRequestBodyRejected(resp);
+ }
+
@Test
public void testCreateRole() throws IllegalAccessException,
NoSuchFieldException, IOException {
SecurableObject securableObject =
diff --git
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestSchemaOperations.java
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestSchemaOperations.java
index 1a9ffc43ad..7b7178eb2e 100644
---
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestSchemaOperations.java
+++
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestSchemaOperations.java
@@ -218,6 +218,17 @@ public class TestSchemaOperations extends
BaseOperationsTest {
verify(dispatcher, never()).listSchemas(any());
}
+ @Test
+ public void testCreateSchemaWithNullRequest() {
+ Response resp =
+ target("/metalakes/" + metalake + "/catalogs/" + catalog + "/schemas")
+ .request(MediaType.APPLICATION_JSON_TYPE)
+ .accept("application/vnd.gravitino.v1+json")
+ .post(Entity.entity(new byte[0], MediaType.APPLICATION_JSON_TYPE));
+
+ assertNullRequestBodyRejected(resp);
+ }
+
@Test
public void testCreateSchema() {
SchemaCreateRequest req =
diff --git
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestTableOperations.java
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestTableOperations.java
index 9c41650d48..4d11ccb61e 100644
---
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestTableOperations.java
+++
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestTableOperations.java
@@ -225,6 +225,17 @@ public class TestTableOperations extends
BaseOperationsTest {
};
}
+ @Test
+ public void testCreateTableWithNullRequest() {
+ Response resp =
+ target(tablePath(metalake, catalog, schema))
+ .request(MediaType.APPLICATION_JSON_TYPE)
+ .accept("application/vnd.gravitino.v1+json")
+ .post(Entity.entity(new byte[0], MediaType.APPLICATION_JSON_TYPE));
+
+ assertNullRequestBodyRejected(resp);
+ }
+
@Test
public void testCreateTable() {
Column[] columns =
diff --git
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestTagOperations.java
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestTagOperations.java
index 090e49d78f..9a9fe3785f 100644
---
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestTagOperations.java
+++
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestTagOperations.java
@@ -272,6 +272,17 @@ public class TestTagOperations extends BaseOperationsTest {
Assertions.assertEquals(0, tagListResp2.getTags().length);
}
+ @Test
+ public void testCreateTagWithNullRequest() {
+ Response resp =
+ target(tagPath(metalake))
+ .request(MediaType.APPLICATION_JSON_TYPE)
+ .accept("application/vnd.gravitino.v1+json")
+ .post(Entity.entity(new byte[0], MediaType.APPLICATION_JSON_TYPE));
+
+ assertNullRequestBodyRejected(resp);
+ }
+
@Test
public void testCreateTag() {
TagEntity tag1 =
diff --git
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestTopicOperations.java
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestTopicOperations.java
index 67c9cdbbb4..d26e642e12 100644
---
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestTopicOperations.java
+++
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestTopicOperations.java
@@ -226,6 +226,17 @@ public class TestTopicOperations extends
BaseOperationsTest {
Assertions.assertEquals(RuntimeException.class.getSimpleName(),
errorResp2.getType());
}
+ @Test
+ public void testCreateTopicWithNullRequest() {
+ Response resp =
+ target(topicPath(metalake, catalog, schema))
+ .request(MediaType.APPLICATION_JSON_TYPE)
+ .accept("application/vnd.gravitino.v1+json")
+ .post(Entity.entity(new byte[0], MediaType.APPLICATION_JSON_TYPE));
+
+ assertNullRequestBodyRejected(resp);
+ }
+
@Test
public void testCreateTopic() {
Topic topic = mockTopic("topic1", "comment", ImmutableMap.of("key1",
"value1"));
diff --git
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestUserOperations.java
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestUserOperations.java
index eac08e9175..7eb57051e0 100644
---
a/server/src/test/java/org/apache/gravitino/server/web/rest/TestUserOperations.java
+++
b/server/src/test/java/org/apache/gravitino/server/web/rest/TestUserOperations.java
@@ -118,6 +118,17 @@ public class TestUserOperations extends BaseOperationsTest
{
return resourceConfig;
}
+ @Test
+ public void testAddUserWithNullRequest() {
+ Response resp =
+ target("/metalakes/metalake1/users")
+ .request(MediaType.APPLICATION_JSON_TYPE)
+ .accept("application/vnd.gravitino.v1+json")
+ .post(Entity.entity(new byte[0], MediaType.APPLICATION_JSON_TYPE));
+
+ assertNullRequestBodyRejected(resp);
+ }
+
@Test
public void testAddUser() throws IOException {
UserAddRequest req = new UserAddRequest("user1");