apache / apache/gravitino

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

Open
#10,171 3 comments 0 reactions 1 assignee Claimed by @shaojunying View on GitHub
good first issue improvement
Dominant language
Java
Stars
3.2k
Forks
935
Avg merge
1d 15h
Merged PRs (30d)
315

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
```java
@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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.