Skip to content

Commit d57212b

Browse files
committed
Upgrade to Jersey 2.26 and Jax RS 2.1. This addresses #108 and partly #95. Also switched from HK2's Factory objects to generic Suppliers for servlet injection.
1 parent cbc8231 commit d57212b

File tree

9 files changed

+66
-65
lines changed

9 files changed

+66
-65
lines changed

aws-serverless-java-container-core/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
<properties>
1818
<jackson.version>2.9.3</jackson.version>
19-
<jaxrs.version>2.0.1</jaxrs.version>
19+
<jaxrs.version>2.1</jaxrs.version>
2020
<servlet.version>3.1.0</servlet.version>
2121
</properties>
2222

aws-serverless-java-container-jersey/pom.xml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
</parent>
1616

1717
<properties>
18-
<jersey.version>2.25.1</jersey.version>
18+
<jersey.version>2.26</jersey.version>
1919
</properties>
2020

2121
<dependencies>
@@ -39,6 +39,14 @@
3939
<version>${jersey.version}</version>
4040
</dependency>
4141

42+
<dependency>
43+
<groupId>org.glassfish.jersey.inject</groupId>
44+
<artifactId>jersey-hk2</artifactId>
45+
<version>${jersey.version}</version>
46+
<optional>true</optional>
47+
<scope>test</scope>
48+
</dependency>
49+
4250
<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
4351
<dependency>
4452
<groupId>commons-codec</groupId>

aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyHandlerFilter.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequest;
55
import com.amazonaws.serverless.proxy.internal.testutils.Timer;
6+
import com.amazonaws.serverless.proxy.jersey.suppliers.AwsProxyServletRequestSupplier;
67

78
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
89
import org.glassfish.jersey.internal.MapPropertiesDelegate;
@@ -110,7 +111,7 @@ public void destroy() {
110111
* built from the request's <code>getPathInfo()</code> method. The container request also contains the
111112
* API Gateway context, stage variables, and Lambda context properties. The original servlet request is
112113
* also embedded in a property of the container request to allow injection by the
113-
* {@link com.amazonaws.serverless.proxy.jersey.factory.AwsProxyServletRequestFactory}.
114+
* {@link AwsProxyServletRequestSupplier}.
114115
* @param request The incoming servlet request
115116
* @return A populated ContainerRequest object.
116117
* @throws RuntimeException if we could not read the servlet request input stream.

aws-serverless-java-container-jersey/src/main/java/com/amazonaws/serverless/proxy/jersey/JerseyLambdaContainerHandler.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,23 @@
2525
import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequestReader;
2626
import com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletResponseWriter;
2727
import com.amazonaws.serverless.proxy.internal.testutils.Timer;
28+
import com.amazonaws.serverless.proxy.jersey.suppliers.AwsProxyServletContextSupplier;
29+
import com.amazonaws.serverless.proxy.jersey.suppliers.AwsProxyServletRequestSupplier;
30+
import com.amazonaws.serverless.proxy.jersey.suppliers.AwsProxyServletResponseSupplier;
2831
import com.amazonaws.serverless.proxy.model.AwsProxyRequest;
2932
import com.amazonaws.serverless.proxy.model.AwsProxyResponse;
3033

3134
import com.amazonaws.services.lambda.runtime.Context;
3235

36+
import org.glassfish.jersey.internal.inject.AbstractBinder;
37+
import org.glassfish.jersey.process.internal.RequestScoped;
38+
import org.glassfish.jersey.server.ResourceConfig;
39+
3340
import javax.servlet.DispatcherType;
3441
import javax.servlet.FilterRegistration;
42+
import javax.servlet.ServletContext;
43+
import javax.servlet.http.HttpServletRequest;
44+
import javax.servlet.http.HttpServletResponse;
3545
import javax.ws.rs.core.Application;
3646

3747
import java.util.EnumSet;
@@ -124,6 +134,18 @@ public JerseyLambdaContainerHandler(Class<RequestType> requestTypeClass,
124134
super(requestTypeClass, responseTypeClass, requestReader, responseWriter, securityContextWriter, exceptionHandler);
125135
Timer.start("JERSEY_CONTAINER_CONSTRUCTOR");
126136
this.initialized = false;
137+
138+
if (jaxRsApplication instanceof ResourceConfig) {
139+
((ResourceConfig)jaxRsApplication).register(new AbstractBinder() {
140+
@Override
141+
protected void configure() {
142+
bindFactory(AwsProxyServletContextSupplier.class).to(ServletContext.class).in(RequestScoped.class);
143+
bindFactory(AwsProxyServletRequestSupplier.class).to(HttpServletRequest.class).in(RequestScoped.class);
144+
bindFactory(AwsProxyServletResponseSupplier.class).to(HttpServletResponse.class).in(RequestScoped.class);
145+
}
146+
});
147+
}
148+
127149
this.jerseyFilter = new JerseyHandlerFilter(jaxRsApplication);
128150
Timer.stop("JERSEY_CONTAINER_CONSTRUCTOR");
129151
}
Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,18 @@
1010
* OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions
1111
* and limitations under the License.
1212
*/
13-
package com.amazonaws.serverless.proxy.jersey.factory;
13+
package com.amazonaws.serverless.proxy.jersey.suppliers;
1414

1515

16-
import org.glassfish.hk2.api.Factory;
1716
import org.glassfish.jersey.server.ContainerRequest;
1817

1918
import javax.servlet.ServletContext;
2019
import javax.servlet.http.HttpServletRequest;
2120
import javax.ws.rs.InternalServerErrorException;
2221
import javax.ws.rs.core.Context;
2322

23+
import java.util.function.Supplier;
24+
2425
import static com.amazonaws.serverless.proxy.jersey.JerseyHandlerFilter.JERSEY_SERVLET_REQUEST_PROPERTY;
2526

2627

@@ -34,19 +35,23 @@
3435
* .register(new AbstractBinder() {
3536
* {@literal @}Override
3637
* protected void configure() {
37-
* bindFactory(AwsProxyServletContextFactory.class)
38+
* bindFactory(AwsProxyServletContextSupplier.class)
3839
* .to(ServletContext.class)
3940
* .in(RequestScoped.class);
4041
* }
4142
* });
4243
* </code>
4344
* </pre>
4445
*/
45-
public class AwsProxyServletContextFactory implements Factory<ServletContext> {
46+
public class AwsProxyServletContextSupplier implements Supplier<ServletContext> {
4647
@Context ContainerRequest currentRequest;
4748

4849
@Override
49-
public ServletContext provide() {
50+
public ServletContext get() {
51+
return getServletContext();
52+
}
53+
54+
private ServletContext getServletContext() {
5055
HttpServletRequest req = (HttpServletRequest)currentRequest.getProperty(JERSEY_SERVLET_REQUEST_PROPERTY);
5156

5257
if (req == null) {
@@ -56,10 +61,4 @@ public ServletContext provide() {
5661
ServletContext ctx = req.getServletContext();
5762
return ctx;
5863
}
59-
60-
61-
@Override
62-
public void dispose(ServletContext servletContext) {
63-
64-
}
6564
}
Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,16 @@
1010
* OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions
1111
* and limitations under the License.
1212
*/
13-
package com.amazonaws.serverless.proxy.jersey.factory;
13+
package com.amazonaws.serverless.proxy.jersey.suppliers;
1414

1515

16-
import org.glassfish.hk2.api.Factory;
1716
import org.glassfish.jersey.server.ContainerRequest;
18-
import org.slf4j.Logger;
19-
import org.slf4j.LoggerFactory;
2017

2118
import javax.servlet.http.HttpServletRequest;
2219
import javax.ws.rs.core.Context;
2320

21+
import java.util.function.Supplier;
22+
2423
import static com.amazonaws.serverless.proxy.jersey.JerseyHandlerFilter.JERSEY_SERVLET_REQUEST_PROPERTY;
2524

2625

@@ -34,31 +33,28 @@
3433
* .register(new AbstractBinder() {
3534
* {@literal @}Override
3635
* protected void configure() {
37-
* bindFactory(AwsProxyServletRequestFactory.class)
36+
* bindFactory(AwsProxyServletRequestSupplier.class)
3837
* .to(HttpServletRequest.class)
3938
* .in(RequestScoped.class);
4039
* }
4140
* });
4241
* </code>
4342
* </pre>
4443
*/
45-
public class AwsProxyServletRequestFactory
46-
implements Factory<HttpServletRequest> {
44+
public class AwsProxyServletRequestSupplier implements Supplier<HttpServletRequest> {
4745

4846
@Context ContainerRequest currentRequest;
49-
private static Logger log = LoggerFactory.getLogger(AwsProxyServletRequestFactory.class);
5047

5148
//-------------------------------------------------------------
5249
// Implementation - Factory
5350
//-------------------------------------------------------------
5451

5552
@Override
56-
public HttpServletRequest provide() {
57-
return (HttpServletRequest)currentRequest.getProperty(JERSEY_SERVLET_REQUEST_PROPERTY);
53+
public HttpServletRequest get() {
54+
return getServletRequest();
5855
}
5956

60-
61-
@Override
62-
public void dispose(HttpServletRequest httpServletRequest) {
57+
private HttpServletRequest getServletRequest() {
58+
return (HttpServletRequest)currentRequest.getProperty(JERSEY_SERVLET_REQUEST_PROPERTY);
6359
}
6460
}
Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,16 @@
1010
* OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions
1111
* and limitations under the License.
1212
*/
13-
package com.amazonaws.serverless.proxy.jersey.factory;
13+
package com.amazonaws.serverless.proxy.jersey.suppliers;
1414

1515

16-
import org.glassfish.hk2.api.Factory;
1716
import org.glassfish.jersey.server.ContainerRequest;
18-
import org.slf4j.Logger;
19-
import org.slf4j.LoggerFactory;
2017

21-
import javax.servlet.http.HttpServletRequest;
2218
import javax.servlet.http.HttpServletResponse;
2319
import javax.ws.rs.core.Context;
2420

25-
import static com.amazonaws.serverless.proxy.jersey.JerseyHandlerFilter.JERSEY_SERVLET_REQUEST_PROPERTY;
21+
import java.util.function.Supplier;
22+
2623
import static com.amazonaws.serverless.proxy.jersey.JerseyHandlerFilter.JERSEY_SERVLET_RESPONSE_PROPERTY;
2724

2825

@@ -36,31 +33,28 @@
3633
* .register(new AbstractBinder() {
3734
* {@literal @}Override
3835
* protected void configure() {
39-
* bindFactory(AwsProxyServletResponseFactory.class)
36+
* bindFactory(AwsProxyServletResponseSupplier.class)
4037
* .to(HttpServletResponse.class)
4138
* .in(RequestScoped.class);
4239
* }
4340
* });
4441
* </code>
4542
* </pre>
4643
*/
47-
public class AwsProxyServletResponseFactory
48-
implements Factory<HttpServletResponse> {
44+
public class AwsProxyServletResponseSupplier implements Supplier<HttpServletResponse> {
4945

5046
@Context ContainerRequest currentRequest;
51-
private static Logger log = LoggerFactory.getLogger(AwsProxyServletResponseFactory.class);
5247

5348
//-------------------------------------------------------------
5449
// Implementation - Factory
5550
//-------------------------------------------------------------
5651

5752
@Override
58-
public HttpServletResponse provide() {
59-
return (HttpServletResponse)currentRequest.getProperty(JERSEY_SERVLET_RESPONSE_PROPERTY);
53+
public HttpServletResponse get() {
54+
return getServletResponse();
6055
}
6156

62-
63-
@Override
64-
public void dispose(HttpServletResponse httpServletRequest) {
57+
private HttpServletResponse getServletResponse() {
58+
return (HttpServletResponse)currentRequest.getProperty(JERSEY_SERVLET_RESPONSE_PROPERTY);
6559
}
6660
}

aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/EchoJerseyResource.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@
2727
import javax.ws.rs.core.Response;
2828
import javax.ws.rs.core.SecurityContext;
2929
import javax.ws.rs.core.UriInfo;
30+
import javax.ws.rs.ext.ContextResolver;
31+
import javax.ws.rs.ext.Providers;
32+
3033
import java.util.Enumeration;
3134
import java.util.Random;
3235

aws-serverless-java-container-jersey/src/test/java/com/amazonaws/serverless/proxy/jersey/JerseyAwsProxyTest.java

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,6 @@
1313
package com.amazonaws.serverless.proxy.jersey;
1414

1515

16-
import com.amazonaws.serverless.proxy.jersey.factory.AwsProxyServletContextFactory;
17-
import com.amazonaws.serverless.proxy.jersey.factory.AwsProxyServletRequestFactory;
18-
import com.amazonaws.serverless.proxy.jersey.factory.AwsProxyServletResponseFactory;
1916
import com.amazonaws.serverless.proxy.model.AwsProxyRequest;
2017
import com.amazonaws.serverless.proxy.model.AwsProxyResponse;
2118
import com.amazonaws.serverless.proxy.internal.servlet.AwsServletContext;
@@ -28,15 +25,10 @@
2825
import com.fasterxml.jackson.core.JsonProcessingException;
2926
import com.fasterxml.jackson.databind.ObjectMapper;
3027
import org.apache.commons.codec.binary.Base64;
31-
import org.glassfish.hk2.utilities.binding.AbstractBinder;
3228
import org.glassfish.jersey.logging.LoggingFeature;
33-
import org.glassfish.jersey.process.internal.RequestScoped;
3429
import org.glassfish.jersey.server.ResourceConfig;
3530
import org.junit.Test;
3631

37-
import javax.servlet.ServletContext;
38-
import javax.servlet.http.HttpServletRequest;
39-
import javax.servlet.http.HttpServletResponse;
4032
import javax.ws.rs.core.Response;
4133

4234
import java.io.IOException;
@@ -58,22 +50,8 @@ public class JerseyAwsProxyTest {
5850

5951

6052
private static ObjectMapper objectMapper = new ObjectMapper();
61-
private static ResourceConfig app = new ResourceConfig().packages("com.amazonaws.serverless.proxy.jersey", "com.amazonaws.serverless.proxy.jersey.providers")
53+
private static ResourceConfig app = new ResourceConfig().packages("com.amazonaws.serverless.proxy.jersey")
6254
.register(LoggingFeature.class)
63-
.register(new AbstractBinder() {
64-
@Override
65-
protected void configure() {
66-
bindFactory(AwsProxyServletRequestFactory.class)
67-
.to(HttpServletRequest.class)
68-
.in(RequestScoped.class);
69-
bindFactory(AwsProxyServletContextFactory.class)
70-
.to(ServletContext.class)
71-
.in(RequestScoped.class);
72-
bindFactory(AwsProxyServletResponseFactory.class)
73-
.to(HttpServletResponse.class)
74-
.in(RequestScoped.class);
75-
}
76-
})
7755
.property(LoggingFeature.LOGGING_FEATURE_VERBOSITY_SERVER, LoggingFeature.Verbosity.PAYLOAD_ANY);
7856
private static JerseyLambdaContainerHandler<AwsProxyRequest, AwsProxyResponse> handler = JerseyLambdaContainerHandler.getAwsProxyHandler(app);
7957

0 commit comments

Comments
 (0)