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 [![Build Status](https://travis-ci.org/awslabs/aws-serverless-java-container.svg?branch=master)](https://travis-ci.org/awslabs/aws-serverless-java-container) [![Help](http://img.shields.io/badge/help-gitter-E91E63.svg?style=flat-square)](https://gitter.im/awslabs/aws-serverless-java-container) +# Serverless Java container [![Build Status](https://travis-ci.org/awslabs/aws-serverless-java-container.svg?branch=master)](https://travis-ci.org/awslabs/aws-serverless-java-container) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.amazonaws.serverless/aws-serverless-java-container/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.amazonaws.serverless/aws-serverless-java-container) [![Help](http://img.shields.io/badge/help-gitter-E91E63.svg?style=flat-square)](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();