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");

Reply via email to