apache/gravitino

[Improvement] NPEs before try/catch in REST create/register endpoints

Open

#10,171 创建于 2026年3月4日

在 GitHub 查看
 (3 评论) (0 反应) (1 负责人)Java (887 fork)auto 404
good first issueimprovement

仓库指标

Star
 (3,058 star)
PR 合并指标
 (PR 指标待抓取)

描述

What would you like to be improved?

Several REST endpoints dereference request fields (for example request.getName() or request.getJobTemplateName()) before entering their try block.

If request deserialization yields null (for example empty body, literal JSON null, or binding edge cases), this can trigger an uncaught NullPointerException and bypasses expected ExceptionHandlers path.

How should we improve?

Scope

  • server/src/main/java/org/apache/gravitino/server/web/rest/TableOperations.java createTable
  • server/src/main/java/org/apache/gravitino/server/web/rest/FilesetOperations.java createFileset
  • server/src/main/java/org/apache/gravitino/server/web/rest/FunctionOperations.java registerFunction
  • server/src/main/java/org/apache/gravitino/server/web/rest/ModelOperations.java registerModel
  • server/src/main/java/org/apache/gravitino/server/web/rest/SchemaOperations.java createSchema
  • server/src/main/java/org/apache/gravitino/server/web/rest/JobOperations.java registerJobTemplate
  • server/src/main/java/org/apache/gravitino/server/web/rest/JobOperations.java runJob

Expected behavior

  • No request.get*() access before null-safe handling.
  • Null request input should return stable structured error responses (for example, bad request / mapped handler response), not uncaught NPE.
  • Endpoint APIs and behavior to remain unchanged except for safer null handling.

Definition of done

  • Remove pre-try request dereferences in listed methods.
  • Keep existing ExceptionHandlers mapping behavior.
  • Keep endpoint APIs unchanged.
  • Add/adjust unit tests for null request body behavior in matching REST test classes.
  • Run and pass: ./gradlew test -PskipITs

Example unit test

@Test
public void testCreateTableWithNullRequestBody() {
  Response resp =
      target(tablePath(metalake, catalog, schema))
          .request(MediaType.APPLICATION_JSON_TYPE)
          .accept("application/vnd.gravitino.v1+json")
          .post(Entity.entity("null", MediaType.APPLICATION_JSON_TYPE));

  Assertions.assertEquals(Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
}

贡献者指南