diff --git a/README.md b/README.md
index 36726d726..b25ff0615 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# Serverless Java container [](https://travis-ci.org/awslabs/aws-serverless-java-container) [](https://gitter.im/awslabs/aws-serverless-java-container)
+# Serverless Java container [](https://travis-ci.org/awslabs/aws-serverless-java-container) [](https://maven-badges.herokuapp.com/maven-central/com.amazonaws.serverless/aws-serverless-java-container) [](https://gitter.im/awslabs/aws-serverless-java-container)
The `aws-serverless-java-container` makes it easy to run Java applications written with frameworks such as [Spring](https://spring.io/), [Spring Boot](https://projects.spring.io/spring-boot/), [Jersey](https://jersey.java.net/), or [Spark](http://sparkjava.com/) in [AWS Lambda](https://aws.amazon.com/lambda/).
Serverless Java Container natively supports API Gateway's proxy integration models for requests and responses, you can create and inject custom models for methods that use custom mappings.
diff --git a/aws-serverless-java-container-core/pom.xml b/aws-serverless-java-container-core/pom.xml
index 8cb3133f7..7fac3be73 100644
--- a/aws-serverless-java-container-core/pom.xml
+++ b/aws-serverless-java-container-core/pom.xml
@@ -65,42 +65,12 @@
-
-
-
- org.codehaus.mojo
- findbugs-maven-plugin
- 3.0.5
-
-
- Max
-
- Low
-
- true
-
-
-
- com.h3xstream.findsecbugs
- findsecbugs-plugin
- 1.7.1
-
-
-
-
-
-
-
- org.codehaus.mojo
- findbugs-maven-plugin
- 3.0.5
+ com.github.spotbugs
+ spotbugs-maven-plugin
+ 3.1.1
true
- ${project.build.directory}/findbugs
+ ${project.build.directory}/spotbugs
@@ -125,7 +95,7 @@
analyze-compile
diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/LogFormatter.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/LogFormatter.java
new file mode 100644
index 000000000..cef0514d5
--- /dev/null
+++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/LogFormatter.java
@@ -0,0 +1,24 @@
+package com.amazonaws.serverless.proxy;
+
+
+import javax.ws.rs.core.SecurityContext;
+
+
+/**
+ * Implementations of the log formatter interface are used by {@link com.amazonaws.serverless.proxy.internal.LambdaContainerHandler} class to log each request
+ * processed in the container. You can set the log formatter using the {@link com.amazonaws.serverless.proxy.internal.LambdaContainerHandler#setLogFormatter(LogFormatter)}
+ * method. The servlet implementation of the container ({@link com.amazonaws.serverless.proxy.internal.servlet.AwsLambdaServletContainerHandler} includes a
+ * default log formatter that produces Apache combined logs. {@link com.amazonaws.serverless.proxy.internal.servlet.ApacheCombinedServletLogFormatter}.
+ * @param The request type used by the underlying framework
+ * @param The response type produced by the underlying framework
+ */
+public interface LogFormatter {
+ /**
+ * The format method is called by the container handler to produce the log line that should be written to the logs.
+ * @param req The incoming request
+ * @param res The completed response
+ * @param ctx The security context produced based on the request
+ * @return The log line
+ */
+ String format(ContainerRequestType req, ContainerResponseType res, SecurityContext ctx);
+}
diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java
index d9729a222..7f5fd4ea8 100644
--- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java
+++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/LambdaContainerHandler.java
@@ -13,6 +13,8 @@
package com.amazonaws.serverless.proxy.internal;
+import com.amazonaws.serverless.proxy.LogFormatter;
+import com.amazonaws.serverless.proxy.internal.servlet.ApacheCombinedServletLogFormatter;
import com.amazonaws.serverless.proxy.model.ContainerConfig;
import com.amazonaws.serverless.proxy.ExceptionHandler;
import com.amazonaws.serverless.proxy.RequestReader;
@@ -56,10 +58,12 @@ public abstract class LambdaContainerHandler exceptionHandler;
protected Context lambdaContext;
+ protected LogFormatter logFormatter;
private Logger log = LoggerFactory.getLogger(LambdaContainerHandler.class);
+
//-------------------------------------------------------------
// Variables - Private - Static
//-------------------------------------------------------------
@@ -119,6 +123,15 @@ public void stripBasePath(String basePath) {
config.setServiceBasePath(basePath);
}
+ /**
+ * Sets the formatter used to log request data in CloudWatch. By default this is set to use an Apache
+ * combined log format based on the servlet request and response object {@link ApacheCombinedServletLogFormatter}.
+ * @param formatter The log formatter object
+ */
+ public void setLogFormatter(LogFormatter formatter) {
+ this.logFormatter = formatter;
+ }
+
/**
* Proxies requests to the underlying container given the incoming Lambda request. This method returns a populated
@@ -140,6 +153,10 @@ public ResponseType proxy(RequestType request, Context context) {
latch.await();
+ if (logFormatter != null) {
+ log.info(SecurityUtils.crlf(logFormatter.format(containerRequest, containerResponse, securityContext)));
+ }
+
return responseWriter.writeResponse(containerResponse, context);
} catch (Exception e) {
log.error("Error while handling request", e);
diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java
new file mode 100644
index 000000000..66b8fc1b4
--- /dev/null
+++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/ApacheCombinedServletLogFormatter.java
@@ -0,0 +1,123 @@
+package com.amazonaws.serverless.proxy.internal.servlet;
+
+
+import com.amazonaws.serverless.proxy.LogFormatter;
+import com.amazonaws.serverless.proxy.model.ApiGatewayRequestContext;
+
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.ws.rs.core.SecurityContext;
+
+import java.text.SimpleDateFormat;
+import java.time.Instant;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Locale;
+
+import static com.amazonaws.serverless.proxy.RequestReader.API_GATEWAY_CONTEXT_PROPERTY;
+
+
+/**
+ * Default implementation of the log formatter. Based on an HttpServletRequest and HttpServletResponse implementations produced
+ * a log line in the Apache combined log format: https://httpd.apache.org/docs/2.4/logs.html
+ * @param An implementation of HttpServletRequest
+ * @param An implementation of HttpServletResponse
+ */
+public class ApacheCombinedServletLogFormatter
+ implements LogFormatter {
+ SimpleDateFormat dateFormat;
+
+ public ApacheCombinedServletLogFormatter() {
+ dateFormat = new SimpleDateFormat("[dd/MM/yyyy:hh:mm:ss Z]");
+ }
+
+ @Override
+ @SuppressFBWarnings({ "SERVLET_HEADER_REFERER", "SERVLET_HEADER_USER_AGENT" })
+ public String format(ContainerRequestType servletRequest, ContainerResponseType servletResponse, SecurityContext ctx) {
+ //LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined
+ StringBuilder logLineBuilder = new StringBuilder();
+ ApiGatewayRequestContext gatewayContext = (ApiGatewayRequestContext)servletRequest.getAttribute(API_GATEWAY_CONTEXT_PROPERTY);
+
+ // %h
+ logLineBuilder.append(servletRequest.getRemoteAddr());
+ logLineBuilder.append(" ");
+
+ // %l
+ if (gatewayContext != null) {
+ if (gatewayContext.getIdentity().getUserArn() != null) {
+ logLineBuilder.append(gatewayContext.getIdentity().getUserArn());
+ } else {
+ logLineBuilder.append("-");
+ }
+ } else {
+ logLineBuilder.append("-");
+ }
+ logLineBuilder.append(" ");
+
+ // %u
+ if (ctx != null && ctx.getUserPrincipal().getName() != null) {
+ logLineBuilder.append(ctx.getUserPrincipal().getName());
+ logLineBuilder.append(" ");
+ }
+
+
+ // %t
+ if (gatewayContext != null) {
+ logLineBuilder.append(dateFormat.format(Date.from(Instant.ofEpochMilli(gatewayContext.getRequestTimeEpoch()))));
+ } else {
+ logLineBuilder.append(dateFormat.format(Calendar.getInstance().getTime()));
+ }
+ logLineBuilder.append(" ");
+
+ // %r
+ logLineBuilder.append("\"");
+ logLineBuilder.append(servletRequest.getMethod().toUpperCase(Locale.ENGLISH));
+ logLineBuilder.append(" ");
+ logLineBuilder.append(servletRequest.getPathInfo());
+ logLineBuilder.append(" ");
+ logLineBuilder.append(servletRequest.getProtocol());
+ logLineBuilder.append("\" ");
+
+ // %>s
+ logLineBuilder.append(servletResponse.getStatus());
+ logLineBuilder.append(" ");
+
+ // %b
+ if (servletResponse instanceof AwsHttpServletResponse) {
+ AwsHttpServletResponse awsResponse = (AwsHttpServletResponse)servletResponse;
+ if (awsResponse.getAwsResponseBodyBytes().length > 0) {
+ logLineBuilder.append(awsResponse.getAwsResponseBodyBytes().length);
+ } else {
+ logLineBuilder.append("-");
+ }
+ } else {
+ logLineBuilder.append("-");
+ }
+ logLineBuilder.append(" ");
+
+ // \"%{Referer}i\"
+ logLineBuilder.append("\"");
+ if (servletRequest.getHeader("referer") != null) {
+ logLineBuilder.append(servletRequest.getHeader("referer"));
+ } else {
+ logLineBuilder.append("-");
+ }
+ logLineBuilder.append("\" ");
+
+ // \"%{User-agent}i\"
+ logLineBuilder.append("\"");
+ if (servletRequest.getHeader("user-agent") != null) {
+ logLineBuilder.append(servletRequest.getHeader("user-agent"));
+ } else {
+ logLineBuilder.append("-");
+ }
+ logLineBuilder.append("\" ");
+
+ logLineBuilder.append("combined");
+
+
+ return logLineBuilder.toString();
+ }
+}
diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java
index 349c06e02..925ce9735 100644
--- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java
+++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsHttpServletRequest.java
@@ -107,7 +107,7 @@ public String getRequestedSessionId() {
@Override
public HttpSession getSession(boolean b) {
- log.warn("Trying to access session. Lambda functions are stateless and should not rely on the session");
+ log.debug("Trying to access session. Lambda functions are stateless and should not rely on the session");
if (b && null == this.session) {
ApiGatewayRequestContext requestContext = (ApiGatewayRequestContext) getAttribute(RequestReader.API_GATEWAY_CONTEXT_PROPERTY);
this.session = new AwsHttpSession(requestContext.getRequestId());
@@ -118,35 +118,35 @@ public HttpSession getSession(boolean b) {
@Override
public HttpSession getSession() {
- log.warn("Trying to access session. Lambda functions are stateless and should not rely on the session");
+ log.debug("Trying to access session. Lambda functions are stateless and should not rely on the session");
return this.session;
}
@Override
public String changeSessionId() {
- log.warn("Trying to access session. Lambda functions are stateless and should not rely on the session");
+ log.debug("Trying to access session. Lambda functions are stateless and should not rely on the session");
return null;
}
@Override
public boolean isRequestedSessionIdValid() {
- log.warn("Trying to access session. Lambda functions are stateless and should not rely on the session");
+ log.debug("Trying to access session. Lambda functions are stateless and should not rely on the session");
return false;
}
@Override
public boolean isRequestedSessionIdFromCookie() {
- log.warn("Trying to access session. Lambda functions are stateless and should not rely on the session");
+ log.debug("Trying to access session. Lambda functions are stateless and should not rely on the session");
return false;
}
@Override
public boolean isRequestedSessionIdFromURL() {
- log.warn("Trying to access session. Lambda functions are stateless and should not rely on the session");
+ log.debug("Trying to access session. Lambda functions are stateless and should not rely on the session");
return false;
}
@@ -154,7 +154,7 @@ public boolean isRequestedSessionIdFromURL() {
@Override
@Deprecated
public boolean isRequestedSessionIdFromUrl() {
- log.warn("Trying to access session. Lambda functions are stateless and should not rely on the session");
+ log.debug("Trying to access session. Lambda functions are stateless and should not rely on the session");
return false;
}
@@ -275,7 +275,7 @@ protected Cookie[] parseCookieHeaderValue(String headerValue) {
return parsedHeaders.stream()
.filter(e -> e.getKey() != null)
- .map(e -> new Cookie(e.getKey(), e.getValue()))
+ .map(e -> new Cookie(SecurityUtils.crlf(e.getKey()), SecurityUtils.crlf(e.getValue())))
.toArray(Cookie[]::new);
}
@@ -304,7 +304,7 @@ protected String generateQueryString(Map parameters) {
newValue = URLEncoder.encode(newValue, StandardCharsets.UTF_8.name());
}
} catch (UnsupportedEncodingException e) {
- log.error("Could not URLEncode: " + newKey, e);
+ log.error(SecurityUtils.crlf("Could not URLEncode: " + newKey), e);
}
return newKey + "=" + newValue;
diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java
index bce33e3a7..fa29e94e9 100644
--- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java
+++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsLambdaServletContainerHandler.java
@@ -34,6 +34,7 @@
import java.io.IOException;
+
/**
* Abstract extension of the code LambdaContainerHandler object that adds protected variables for the
* ServletContext and FilterChainManager. This object should be extended by the framework-specific
@@ -73,6 +74,8 @@ protected AwsLambdaServletContainerHandler(RequestReader securityContextWriter,
ExceptionHandler exceptionHandler) {
super(requestReader, responseWriter, securityContextWriter, exceptionHandler);
+ // set the default log formatter for servlet implementations
+ setLogFormatter(new ApacheCombinedServletLogFormatter<>());
}
//-------------------------------------------------------------
diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java
index a964a1b43..9c8a19edf 100644
--- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java
+++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequest.java
@@ -501,8 +501,7 @@ public Map getParameterMap() {
@Override
public String getProtocol() {
- // TODO: We should have a cloudfront protocol header
- return null;
+ return request.getRequestContext().getProtocol();
}
@@ -621,6 +620,14 @@ public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse se
private String getHeaderCaseInsensitive(String key) {
+ // special cases for referer and user agent headers
+ if ("referer".equals(key.toLowerCase(Locale.ENGLISH))) {
+ return request.getRequestContext().getIdentity().getCaller();
+ }
+ if ("user-agent".equals(key.toLowerCase(Locale.ENGLISH))) {
+ return request.getRequestContext().getIdentity().getUserAgent();
+ }
+
if (request.getHeaders() == null) {
return null;
}
diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java
index b9c839f1d..abda69331 100644
--- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java
+++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/testutils/AwsProxyRequestBuilder.java
@@ -68,6 +68,7 @@ public AwsProxyRequestBuilder(String path, String httpMethod) {
this.request.setRequestContext(new ApiGatewayRequestContext());
this.request.getRequestContext().setRequestId("test-invoke-request");
this.request.getRequestContext().setStage("test");
+ this.request.getRequestContext().setProtocol("HTTP/1.1");
ApiGatewayRequestIdentity identity = new ApiGatewayRequestIdentity();
identity.setSourceIp("127.0.0.1");
this.request.getRequestContext().setIdentity(identity);
@@ -236,6 +237,30 @@ public AwsProxyRequestBuilder serverName(String serverName) {
return this;
}
+ public AwsProxyRequestBuilder userAgent(String agent) {
+ if (request.getRequestContext() == null) {
+ request.setRequestContext(new ApiGatewayRequestContext());
+ }
+ if (request.getRequestContext().getIdentity() == null) {
+ request.getRequestContext().setIdentity(new ApiGatewayRequestIdentity());
+ }
+
+ request.getRequestContext().getIdentity().setUserAgent(agent);
+ return this;
+ }
+
+ public AwsProxyRequestBuilder referer(String referer) {
+ if (request.getRequestContext() == null) {
+ request.setRequestContext(new ApiGatewayRequestContext());
+ }
+ if (request.getRequestContext().getIdentity() == null) {
+ request.getRequestContext().setIdentity(new ApiGatewayRequestIdentity());
+ }
+
+ request.getRequestContext().getIdentity().setCaller(referer);
+ return this;
+ }
+
public AwsProxyRequestBuilder fromJsonString(String jsonContent)
throws IOException {
request = LambdaContainerHandler.getObjectMapper().readValue(jsonContent, AwsProxyRequest.class);
diff --git a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ApiGatewayRequestContext.java b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ApiGatewayRequestContext.java
index 657bde196..edf28e059 100644
--- a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ApiGatewayRequestContext.java
+++ b/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/model/ApiGatewayRequestContext.java
@@ -43,6 +43,9 @@ public class ApiGatewayRequestContext {
private ApiGatewayAuthorizerContext authorizer;
private String stage;
private String path;
+ private String protocol;
+ private String requestTime;
+ private long requestTimeEpoch;
//-------------------------------------------------------------
@@ -146,4 +149,34 @@ public ApiGatewayAuthorizerContext getAuthorizer() {
public void setAuthorizer(ApiGatewayAuthorizerContext authorizer) {
this.authorizer = authorizer;
}
+
+
+ public String getProtocol() {
+ return protocol;
+ }
+
+
+ public void setProtocol(String protocol) {
+ this.protocol = protocol;
+ }
+
+
+ public String getRequestTime() {
+ return requestTime;
+ }
+
+
+ public void setRequestTime(String requestTime) {
+ this.requestTime = requestTime;
+ }
+
+
+ public long getRequestTimeEpoch() {
+ return requestTimeEpoch;
+ }
+
+
+ public void setRequestTimeEpoch(long requestTimeEpoch) {
+ this.requestTimeEpoch = requestTimeEpoch;
+ }
}
diff --git a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java
index fc104432a..b2342efe1 100644
--- a/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java
+++ b/aws-serverless-java-container-core/src/test/java/com/amazonaws/serverless/proxy/internal/servlet/AwsProxyHttpServletRequestTest.java
@@ -23,6 +23,8 @@ public class AwsProxyHttpServletRequestTest {
private static final String FORM_PARAM_TEST = "test_cookie_param";
private static final String QUERY_STRING_NAME_VALUE = "Bob";
private static final String REQUEST_SCHEME_HTTP = "http";
+ private static final String USER_AGENT = "Mozilla/5.0 (Android 4.4; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0";
+ private static final String REFERER = "https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent/Firefox";
private static final AwsProxyRequest REQUEST_WITH_HEADERS = new AwsProxyRequestBuilder("/hello", "GET")
.header(CUSTOM_HEADER_KEY, CUSTOM_HEADER_VALUE)
@@ -46,6 +48,9 @@ public class AwsProxyHttpServletRequestTest {
private static final AwsProxyRequest REQUEST_MULTIPLE_FORM_AND_QUERY = new AwsProxyRequestBuilder("/hello", "POST")
.form(FORM_PARAM_NAME, FORM_PARAM_NAME_VALUE)
.queryString(FORM_PARAM_TEST, QUERY_STRING_NAME_VALUE).build();
+ private static final AwsProxyRequest REQUEST_USER_AGENT_REFERER = new AwsProxyRequestBuilder("/hello", "POST")
+ .userAgent(USER_AGENT)
+ .referer(REFERER).build();
private static final AwsProxyRequest REQUEST_NULL_QUERY_STRING;
static {
@@ -66,6 +71,18 @@ public void headers_getHeader_validRequest() {
assertEquals(MediaType.APPLICATION_JSON, request.getContentType());
}
+ @Test
+ public void headers_getRefererAndUserAgent_returnsContextValues() {
+ HttpServletRequest request = new AwsProxyHttpServletRequest(REQUEST_USER_AGENT_REFERER, null, null);
+ assertNotNull(request.getHeader("Referer"));
+ assertEquals(REFERER, request.getHeader("Referer"));
+ assertEquals(REFERER, request.getHeader("referer"));
+
+ assertNotNull(request.getHeader("User-Agent"));
+ assertEquals(USER_AGENT, request.getHeader("User-Agent"));
+ assertEquals(USER_AGENT, request.getHeader("user-agent"));
+ }
+
@Test
public void formParams_getParameter_validForm() {
HttpServletRequest request = new AwsProxyHttpServletRequest(REQUEST_FORM_URLENCODED, null, null);
diff --git a/aws-serverless-java-container-jersey/pom.xml b/aws-serverless-java-container-jersey/pom.xml
index 9e1532d8b..bcdbdcbf6 100644
--- a/aws-serverless-java-container-jersey/pom.xml
+++ b/aws-serverless-java-container-jersey/pom.xml
@@ -70,42 +70,12 @@
-
-
-
- org.codehaus.mojo
- findbugs-maven-plugin
- 3.0.5
-
-
- Max
-
- Low
-
- true
-
-
-
- com.h3xstream.findsecbugs
- findsecbugs-plugin
- 1.7.1
-
-
-
-
-
-
-
- org.codehaus.mojo
- findbugs-maven-plugin
- 3.0.5
+ com.github.spotbugs
+ spotbugs-maven-plugin
+ 3.1.1
true
- ${project.build.directory}/findbugs
+ ${project.build.directory}/spotbugs
@@ -130,7 +100,7 @@
analyze-compile
diff --git a/aws-serverless-java-container-spark/pom.xml b/aws-serverless-java-container-spark/pom.xml
index 917386010..f534b090b 100644
--- a/aws-serverless-java-container-spark/pom.xml
+++ b/aws-serverless-java-container-spark/pom.xml
@@ -41,36 +41,6 @@
-
-
-
- org.codehaus.mojo
- findbugs-maven-plugin
- 3.0.5
-
-
- Max
-
- Low
-
- true
-
-
-
- com.h3xstream.findsecbugs
- findsecbugs-plugin
- 1.7.1
-
-
-
-
-
-
-
@@ -83,9 +53,9 @@
- org.codehaus.mojo
- findbugs-maven-plugin
- 3.0.5
+ com.github.spotbugs
+ spotbugs-maven-plugin
+ 3.1.1
true
- ${project.build.directory}/findbugs
+ ${project.build.directory}/spotbugs
@@ -110,7 +80,7 @@
analyze-compile
diff --git a/aws-serverless-java-container-spring/pom.xml b/aws-serverless-java-container-spring/pom.xml
index 56e710483..9814c0f84 100644
--- a/aws-serverless-java-container-spring/pom.xml
+++ b/aws-serverless-java-container-spring/pom.xml
@@ -146,36 +146,6 @@
-
-
-
- org.codehaus.mojo
- findbugs-maven-plugin
- 3.0.5
-
-
- Max
-
- Low
-
- true
-
-
-
- com.h3xstream.findsecbugs
- findsecbugs-plugin
- 1.7.1
-
-
-
-
-
-
-
@@ -188,9 +158,9 @@
- org.codehaus.mojo
- findbugs-maven-plugin
- 3.0.5
+ com.github.spotbugs
+ spotbugs-maven-plugin
+ 3.1.1
true
- ${project.build.directory}/findbugs
+ ${project.build.directory}/spotbugs
@@ -215,7 +185,7 @@
analyze-compile
diff --git a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/PetsController.java b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/PetsController.java
index df622b10d..a84f42326 100644
--- a/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/PetsController.java
+++ b/samples/spring/pet-store/src/main/java/com/amazonaws/serverless/sample/spring/PetsController.java
@@ -37,7 +37,6 @@ public Pet createPet(@RequestBody Pet newPet) {
@RequestMapping(path = "/pets", method = RequestMethod.GET)
public Pet[] listPets(@RequestParam("limit") Optional limit, Principal principal) {
- System.out.println(principal.getName());
int queryLimit = 10;
if (limit.isPresent()) {
queryLimit = limit.get();