-
Notifications
You must be signed in to change notification settings - Fork 571
Quick start Jersey
You can use the aws-serverless-java-container library to run a JAX-RS Jersey application in AWS Lambda. You can use the library within your Lambda handler to load your Jersey application and proxy events to it.
In the repository we have included a sample Jersey application to get you started.
The first step is to import the Jersey implementation of the library:
<dependency>
<groupId>com.amazonaws.serverless</groupId>
<artifactId>aws-serverless-java-container-jersey</artifactId>
<version>[0.8,)</version>
</dependency>This will automatically also import the aws-serverless-java-container-core and aws-lambda-java-core libraries.
In your application package declare a new class that implements Lambda's RequestStreamHandler interface. If you have configured API Gateway with a proxy integration, you can use the built-in POJOs AwsProxyRequest and AwsProxyResponse.
The next step is to declare the container handler object. The library exposes a utility static method that configures a JerseyLambdaContainerHandler object for AWS proxy events. The method receives an initialized ResourceConfig object. The handler object should be declared as a class property and be static. By doing this, Lambda will re-use the instance for subsequent requests.
The handleRequest method of the class can use the handler object we declared in the previous step to send requests to the Jersey application.
public class StreamLambdaHandler implements RequestStreamHandler {
private static final ResourceConfig jerseyApplication = new ResourceConfig()
.packages("com.amazonaws.serverless.sample.jersey")
.register(JacksonFeature.class);
private static final JerseyLambdaContainerHandler<AwsProxyRequest, AwsProxyResponse> handler
= JerseyLambdaContainerHandler.getAwsProxyHandler(jerseyApplication);
@Override
public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context)
throws IOException {
handler.proxyStream(inputStream, outputStream, context);
// just in case it wasn't closed by the mapper
outputStream.close();
}
}In our sample application, resource classes are declared in the com.amazonaws.serverless.sample.jersey package.
The aws-serverless-java-container-jersey includes Jersey factory classes to produce HttpServletRequest and ServletContext objects for your methods. First, you will need to register the factory with your Jersey application.
ResourceConfig app = new ResourceConfig()
.packages("com.amazonaws.serverless.proxy.test.jersey")
.register(new AbstractBinder() {
@Override
protected void configure() {
bindFactory(AwsProxyServletRequestFactory.class)
.to(HttpServletRequest.class)
.in(RequestScoped.class);
bindFactory(AwsProxyServletResponseFactory.class)
.to(HttpServletResponse.class)
.in(RequestScoped.class);
bindFactory(AwsProxyServletContextFactory.class)
.to(ServletContext.class)
.in(RequestScoped.class);
}
});Once the factory is registered, you can receive HttpServletRequest, HttpServletResponse, and ServletContext objects in your methods using the @Context annotation.
@Path("/my-servlet") @GET
public String echoServletHeaders(@Context HttpServletRequest context) {
Enumeration<String> headerNames = context.getHeaderNames();
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
}
return "servlet";
}You can follow the instructions in AWS Lambda's documentation on how to package your function for deployment.