apache/gravitino
View on GitHub[Improvement] NPEs before try/catch in REST create/register endpoints
Open
#10,171 opened on Mar 4, 2026
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.javacreateTable -
server/src/main/java/org/apache/gravitino/server/web/rest/FilesetOperations.javacreateFileset -
server/src/main/java/org/apache/gravitino/server/web/rest/FunctionOperations.javaregisterFunction -
server/src/main/java/org/apache/gravitino/server/web/rest/ModelOperations.javaregisterModel -
server/src/main/java/org/apache/gravitino/server/web/rest/SchemaOperations.javacreateSchema -
server/src/main/java/org/apache/gravitino/server/web/rest/JobOperations.javaregisterJobTemplate -
server/src/main/java/org/apache/gravitino/server/web/rest/JobOperations.javarunJob
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
ExceptionHandlersmapping 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());
}