apache/gravitino

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

Open

#10,171 opened on Mar 4, 2026

View on GitHub
 (3 comments) (0 reactions) (1 assignee)Java (887 forks)auto 404
good first issueimprovement

Repository metrics

Stars
 (3,058 stars)
PR merge metrics
 (PR metrics pending)

Description

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());
}

Contributor guide