Skip to content

Jersey : AwsProxyHttpServletResponseWriter : NullPointerException for Status that is not present in Response.StatusType #497

@anmolk6

Description

@anmolk6

To help us debug your issue fill in the basic information below using the options provided

Serverless Java Container version: 1.9

Implementations: Jersey

Framework version: jersey-media-json-jackson : 2.37

Frontend service: ALB

Deployment method: Console

Scenario

I am trying to return 422 statusCode in specific scenario using javax.ws.rs.core Response.status(422).entity(response).build();

Expected behavior

It should through exception with status 422

Actual behavior

502Bad Gateway
{
"message": "Gateway timeout"
}

Steps to reproduce

@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response createPet(final Pet newPet) {
    if (newPet.getName() == null || newPet.getBreed() == null) {
        return Response.status(422).entity(new Error("Invalid name or breed")).build();
    }
    Pet dbPet = newPet;
    dbPet.setId(UUID.randomUUID().toString());
    return Response.status(200).entity(dbPet).build();
}

Full log output

"java.lang.NullPointerException: null\n\tat com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter.writeResponse(AwsProxyHttpServletResponseWriter.java:77)\n\tat com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter.writeResponse(AwsProxyHttpServletResponseWriter.java:36)\n\tat com.amazonaws.serverless.proxy.internal.LambdaContainerHandler.proxy(LambdaContainerHandler.java:222)\n\tat com.amazonaws.serverless.proxy.internal.LambdaContainerHandler.proxyStream(LambdaContainerHandler.java:257)\n\tat com.telstra.digitalservices.lambda.Handler.handleRequest(Handler.java:42)\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)\n\tat java.base/java.lang.reflect.Method.invoke(Unknown Source)\n\tat lambdainternal.EventHandlerLoader$StreamMethodRequestHandler.handleRequest(EventHandlerLoader.java:375)\n\tat lambdainternal.EventHandlerLoader$2.call(EventHandlerLoader.java:899)\n\tat lambdainternal.AWSLambda.startRuntime(AWSLambda.java:268)\n\tat lambdainternal.AWSLambda.startRuntime(AWSLambda.java:206)\n\tat lambdainternal.AWSLambda.main(AWSLambda.java:200)\n"

Analysis

As per analysis it's failing while getting reason phrase on
https://github.com/awslabs/aws-serverless-java-container/blob/main/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletResponseWriter.java#L77

422 is not present by default in provided enum , so fromStatusCode(int statusCode) is returning null as per its implementation

public static Status fromStatusCode(int statusCode) {
for (Status s : values()) {
if (s.code == statusCode) {
return s;
}
}
return null;
}

And null.getReasonPhrase is causing this nullPointerException.

Could you please suggest ways to handle this?

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions