java - Spring Boot 2 - 随机 500 和 400 错误
问题描述
我基于 Spring Boot 2.0.4 RELEASE 创建了 4 个微服务的集合,其中一个微服务充当其他微服务的网关。
使用 Angular 应用程序作为我的客户端,当我向网关应用程序发出请求时,我遇到随机 500 或 400 错误。
Stacktrace 是这样的
java.lang.NullPointerException: null
at org.springframework.web.util.UrlPathHelper.removeJsessionid(UrlPathHelper.java:517) ~[spring-web-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.web.util.UrlPathHelper.removeSemicolonContent(UrlPathHelper.java:502) ~[spring-web-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.web.util.UrlPathHelper.decodeAndCleanUriString(UrlPathHelper.java:435) ~[spring-web-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.web.util.UrlPathHelper.getOriginatingRequestUri(UrlPathHelper.java:382) ~[spring-web-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1062) [spring-webmvc-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1008) [spring-webmvc-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925) [spring-webmvc-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974) [spring-webmvc-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:877) [spring-webmvc-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:661) [tomcat-embed-core-8.5.32.jar:8.5.32]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851) [spring-webmvc-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) [tomcat-embed-core-8.5.32.jar:8.5.32]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [tomcat-embed-core-8.5.32.jar:8.5.32]
...
或者
org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: public java.lang.Object com.fe.api.routing.v1.controllers.chat.LikeController.isLike(com.commons.v1.commandObjects.chat.LikeCommand,com.fe.commons.v1.dtos.AppUserDTO) throws java.lang.Exception
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:160)
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:130)
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:124)
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:161)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:131)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:877)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:783)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:877)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at com.fe.api.routing.config.HTTPRoutesFilter.doFilter(HTTPRoutesFilter.java:384) ...
我创建了一个过滤器来拦截和执行一些业务逻辑,然后再将请求发送到 Controller
public class HTTPRoutesFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
httpServletRequest = (HttpServletRequest) request;
httpServletResponse = (HttpServletResponse) response;
ResponseObject responseObject = new ResponseObject();
Map<String, String> headersMap = new HashMap<>();
String platformHeader = RequestReader.getRequestHeaderValue(httpServletRequest, PLATFORM_HEADER_KEY);
String xAuthToken = RequestReader.getRequestHeaderValue(httpServletRequest, AUTH_TOKEN_HEADER_KEY);
// for CORS enablement
headersMap.put("Access-Control-Allow-Origin", "*");
headersMap.put("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE, PATCH");
headersMap.put("Access-Control-Max-Age", "1728000");
headersMap.put("Access-Control-Allow-Headers", Arrays.asList(HttpHeaders.CONTENT_TYPE, "A_T", "x-platform", "x-auth-token", RESPONSE_CODE_HEADER_KEY).stream().reduce((x,y) -> (x.toLowerCase() + "," + y.toLowerCase())).get());
headersMap.put("Access-Control-Expose-Headers", Arrays.asList(HttpHeaders.CONTENT_TYPE, "A_T", "x-platform", "x-auth-token", RESPONSE_CODE_HEADER_KEY).stream().reduce((x,y) -> (x.toLowerCase() + "," + y.toLowerCase())).get());
headersMap.forEach(((HttpServletResponse) response)::setHeader);
if (isNonPlatformApi() || httpServletRequest.getMethod().equals(RequestMethod.OPTIONS.name())){
// continue
} else {
if (platformHeader == null) { // if platform header is not present
httpServletResponse.setStatus(HttpStatus.BAD_REQUEST.value());
responseObject.setResponseCode(ResponseCodesMap.getInstance().getResponseCodeByType(ResponseTypeEnum.BAD_REQUEST));
responseObject.setDebugMessage("Platform Header is not present");
httpServletResponse.getOutputStream().write(objectMapper.writeValueAsBytes(responseObject));;
return;
} else {
List<String> platformValueList = Arrays.stream(Platform.values()).map(Platform::name).collect(Collectors.toList());
if (!platformValueList.contains(Objects.requireNonNull(platformHeader.trim()))){
httpServletResponse.setStatus(HttpStatus.BAD_REQUEST.value());
responseObject.setResponseCode(ResponseCodesMap.getInstance().getResponseCodeByType(ResponseTypeEnum.BAD_REQUEST));
responseObject.setData("Platform Header value should be one of : "+Arrays.asList(Platform.values()));
httpServletResponse.getOutputStream().write(objectMapper.writeValueAsBytes(responseObject));;
return;
}
}
if (!isNonAuthenticatedApi() && xAuthToken == null) {
httpServletResponse.setStatus(HttpStatus.BAD_REQUEST.value());
responseObject.setResponseCode(ResponseCodesMap.getInstance().getResponseCodeByType(ResponseTypeEnum.BAD_REQUEST));
responseObject.setDebugMessage("Auth Token is not present");
httpServletResponse.getOutputStream().write(objectMapper.writeValueAsBytes(responseObject));;
return;
}
}
// send BAD_REQUEST for CORS
if (httpServletRequest.getMethod().equals(RequestMethod.OPTIONS.name())) {
/*httpServletResponse.setStatus(HttpStatus.BAD_REQUEST.value());
responseObject.setResponseCode(ResponseCodesMap.getInstance().getResponseCodeByType(ResponseTypeEnum.BAD_REQUEST));
responseObject.setDebugMessage("CORS request must be handled by NGINX/Apache. Must be returned from web server itself");
httpServletResponse.getOutputStream().write(objectMapper.writeValueAsBytes(responseObject));;*/
// for CORS enablement
headersMap.put("Access-Control-Allow-Origin", "*");
headersMap.put("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE, PATCH");
headersMap.put("Access-Control-Max-Age", "1728000");
headersMap.put("Access-Control-Allow-Headers", Arrays.asList(HttpHeaders.CONTENT_TYPE, "A_T", "x-platform", "x-auth-token", RESPONSE_CODE_HEADER_KEY).stream().reduce((x,y) -> (x.toLowerCase() + "," + y.toLowerCase())).get());
headersMap.put("Access-Control-Expose-Headers", Arrays.asList(HttpHeaders.CONTENT_TYPE, "A_T", "x-platform", "x-auth-token", RESPONSE_CODE_HEADER_KEY).stream().reduce((x,y) -> (x.toLowerCase() + "," + y.toLowerCase())).get());
headersMap.forEach(((HttpServletResponse) response)::setHeader);
} else {
try {
if (httpServletRequest.getRequestURI().equals(LOGIN_URI)) {
String body;
if (httpServletRequest instanceof ContentCachingRequestWrapper) {
body = RequestReader.getRequestBody((ContentCachingRequestWrapper) httpServletRequest);
} else {
body = RequestReader.getRequestBody(httpServletRequest);
}
httpServletResponse.setStatus(HttpStatus.OK.value());
AppUserDTO appUserDTO = objectMapper.readValue(body, AppUserDTO.class);
StringBuilder authToken = new StringBuilder();
Object appUserResponse = userManagementService.authenticateUser(appUserDTO, authToken);
if (appUserResponse != null) {
httpServletResponse.addHeader(AUTH_TOKEN_HEADER_KEY, authToken.toString());
httpServletResponse.setStatus(HttpStatus.OK.value());
responseObject.setData(appUserResponse);
responseObject.setResponseCode(ResponseCodesMap.getInstance().getResponseCodeByType(ResponseTypeEnum.OK));
httpServletResponse.getOutputStream().write(objectMapper.writeValueAsBytes(responseObject));;
return;
}
} else if (httpServletRequest.getRequestURI().equals(LOGOUT_URI)) {
String authToken = RequestReader.getRequestHeaderValue(httpServletRequest, AUTH_TOKEN_HEADER_KEY);
String[] removeAllSessions = httpServletRequest
.getParameterValues("removeAllSession");
Boolean logoutAllSessions;
if (removeAllSessions == null || removeAllSessions.length == 0) {
logoutAllSessions = false;
} else {
logoutAllSessions = Boolean.valueOf(removeAllSessions[0]);
}
Object respObject = userManagementService.logoutAppUser(authToken, logoutAllSessions);
responseObject.setData(respObject);
responseObject.setResponseCode(ResponseCodesMap.getInstance().getResponseCodeByType(ResponseTypeEnum.OK));
httpServletResponse.addHeader(HttpHeaders.CONTENT_TYPE, "application/json");
httpServletResponse.getOutputStream().write(objectMapper.writeValueAsBytes(responseObject));;
return;
} else if (httpServletRequest.getRequestURI().equals(FORGOT_PASSWORD_URI)) {
// do nothing here, continue to filter chain
} else if (httpServletRequest.getRequestURI().equals(USER_REGISTRATION_URI)) {
// do nothing here, continue to filter chain
} else if (httpServletRequest.getRequestURI().equals(CONFIG_API_URI)) {
// do nothing here, continue to filter chain
} else if (httpServletRequest.getRequestURI().equals(VERIFY_USER_EMAIL_URI)) {
String verificationToken = httpServletRequest.getParameter(PlatformConstants.VERIFICATION_TOKEN_NAME);
Object respObject = userManagementService.verifyRegisteredUser(verificationToken);
responseObject.setData(respObject);
responseObject.setResponseCode(ResponseCodesMap.getInstance().getResponseCodeByType(ResponseTypeEnum.OK));
httpServletResponse.addHeader(HttpHeaders.CONTENT_TYPE, "application/json");
httpServletResponse.getOutputStream().write(objectMapper.writeValueAsBytes(responseObject));
return;
} else if (httpServletRequest.getRequestURI().equals(SEND_VERIFICATION_EMAIL_URI)) {
Object respObject = userManagementService.sendVerificationEmail(xAuthToken);
responseObject.setData(respObject);
responseObject.setResponseCode(ResponseCodesMap.getInstance().getResponseCodeByType(ResponseTypeEnum.OK));
httpServletResponse.addHeader(HttpHeaders.CONTENT_TYPE, "application/json");
httpServletResponse.getOutputStream().write(objectMapper.writeValueAsBytes(responseObject));;
LOGGER.debug("->->->-> Sent verification mail <-<-<-");
LOGGER.debug(objectMapper.writeValueAsString(responseObject));
return;
} else if (httpServletRequest.getRequestURI().equals(FB_LOGIN_URI)) {
String body = RequestReader.getRequestBody(httpServletRequest);
FacebookLoginCO facebookLoginCO = objectMapper.readValue(body, FacebookLoginCO.class);
StringBuilder authToken = new StringBuilder();
Object respObject = authService.fbLogin(facebookLoginCO, authToken);
responseObject.setData(respObject);
responseObject.setResponseCode(ResponseCodesMap.getInstance().getResponseCodeByType(ResponseTypeEnum.OK));
httpServletResponse.addHeader(HttpHeaders.CONTENT_TYPE, "application/json");
httpServletResponse.addHeader(PlatformConstants.AUTH_TOKEN_HEADER_NAME, authToken.toString());
httpServletResponse.getOutputStream().write(objectMapper.writeValueAsBytes(responseObject));;
return;
} else if (httpServletRequest.getRequestURI().equals(CONNECT_TO_FACEBOOK)) {
String body = RequestReader.getRequestBody(httpServletRequest);
FacebookLoginCO facebookLoginCO = objectMapper.readValue(body, FacebookLoginCO.class);
StringBuilder authToken = new StringBuilder();
Object respObject = authService.connectToFb(facebookLoginCO, xAuthToken, authToken);
responseObject.setData(respObject);
responseObject.setResponseCode(ResponseCodesMap.getInstance().getResponseCodeByType(ResponseTypeEnum.OK));
httpServletResponse.addHeader(HttpHeaders.CONTENT_TYPE, "application/json");
httpServletResponse.addHeader(PlatformConstants.AUTH_TOKEN_HEADER_NAME, authToken.toString());
httpServletResponse.getOutputStream().write(objectMapper.writeValueAsBytes(responseObject));;
return;
} else if (httpServletRequest.getRequestURI().equals(FORCE_FB_LOGIN_URI)) {
String body = RequestReader.getRequestBody(httpServletRequest);
FacebookLoginCO facebookLoginCO = objectMapper.readValue(body, FacebookLoginCO.class);
StringBuilder authToken = new StringBuilder();
Object respObject = authService.forceLogin(facebookLoginCO, authToken);
responseObject.setData(respObject);
responseObject.setResponseCode(ResponseCodesMap.getInstance().getResponseCodeByType(ResponseTypeEnum.OK));
httpServletResponse.addHeader(HttpHeaders.CONTENT_TYPE, "application/json");
httpServletResponse.addHeader(PlatformConstants.AUTH_TOKEN_HEADER_NAME, authToken.toString());
httpServletResponse.getOutputStream().write(objectMapper.writeValueAsBytes(responseObject));;
return;
} else if (isNonAuthenticatedApi()) {
// do nothing here, continue to filter chain
} else {
if (xAuthToken == null || xAuthToken.equals("")) {
responseObject.setDebugMessage("Auth Token is not present");
responseObject.setResponseCode(ResponseCodesMap.getInstance().getResponseCodeByType(ResponseTypeEnum.UNAUTHORIZED));
httpServletResponse.setStatus(HttpStatus.FORBIDDEN.value());
httpServletResponse.getOutputStream().write(objectMapper.writeValueAsBytes(responseObject));;
return;
} else {
Object respObject = userManagementService.verifyAppUserToken(xAuthToken);
AppUserDTO requestUser = objectMapper.convertValue(respObject, AppUserDTO.class);
httpServletRequest.setAttribute("user", requestUser);
}
}
} catch (Exception e) {
if (e instanceof HttpStatusCodeException) {
HttpStatusCodeException hcee = (HttpStatusCodeException) e;
httpServletResponse.setStatus(hcee.getRawStatusCode());
if (hcee.getResponseBodyAsByteArray().length > 0) {
ResponseObject respObject = objectMapper.readValue(hcee.getResponseBodyAsString(), ResponseObject.class);
responseObject.setDebugMessage(respObject.getDebugMessage());
responseObject.setResponseCode(respObject.getResponseCode());
httpServletResponse.getOutputStream().write(objectMapper.writeValueAsBytes(responseObject));;
}
} else if (e instanceof MyException) {
responseObject.setDebugMessage(e.getMessage());
responseObject.setResponseCode(((MyException) e).getCode());
httpServletResponse.setStatus(((MyException) e).getHttpStatusCode());
httpServletResponse.getOutputStream().write(objectMapper.writeValueAsBytes(responseObject));;
}
return;
}
// continue with filter chain
chain.doFilter(httpServletRequest, response);
}
}
角度应用程序代码是控制器上的简单获取请求:
return this.httpClient.get(this.detailsUrlService.getVideoURL() + videoId, { headers }).pipe((res: any) => {
return res;
},
(error) => {
return error;
});
删除异常处理程序代码并用 Jetty 替换 tomcat 后(由于https://github.com/spring-projects/spring-boot/issues/13236)
我终于到了
org.eclipse.jetty.io.RuntimeIOException: org.eclipse.jetty.io.EofException: Closed
at org.eclipse.jetty.server.ResponseWriter.isOpen(ResponseWriter.java:133) ~[jetty-server-9.4.11.v20180605.jar:9.4.11.v20180605]
at org.eclipse.jetty.server.ResponseWriter.write(ResponseWriter.java:230) ~[jetty-server-9.4.11.v20180605.jar:9.4.11.v20180605]
at org.eclipse.jetty.server.ResponseWriter.write(ResponseWriter.java:248) ~[jetty-server-9.4.11.v20180605.jar:9.4.11.v20180605]
at org.eclipse.jetty.server.handler.ErrorHandler.writeErrorPageHead(ErrorHandler.java:285) ~[jetty-server-9.4.11.v20180605.jar:9.4.11.v20180605]
at org.eclipse.jetty.server.handler.ErrorHandler.writeErrorPage(ErrorHandler.java:275) ~[jetty-server-9.4.11.v20180605.jar:9.4.11.v20180605]
at org.eclipse.jetty.server.handler.ErrorHandler.handleErrorPage(ErrorHandler.java:264) ~[jetty-server-9.4.11.v20180605.jar:9.4.11.v20180605]
at org.eclipse.jetty.server.handler.ErrorHandler.generateAcceptableResponse(ErrorHandler.java:254) ~[jetty-server-9.4.11.v20180605.jar:9.4.11.v20180605]
at org.eclipse.jetty.server.handler.ErrorHandler.generateAcceptableResponse(ErrorHandler.java:172) ~[jetty-server-9.4.11.v20180605.jar:9.4.11.v20180605]
at org.eclipse.jetty.server.handler.ErrorHandler.doError(ErrorHandler.java:142) ~[jetty-server-9.4.11.v20180605.jar:9.4.11.v20180605]
at org.eclipse.jetty.server.handler.ErrorHandler.handle(ErrorHandler.java:78) ~[jetty-server-9.4.11.v20180605.jar:9.4.11.v20180605]
at org.springframework.boot.web.embedded.jetty.JettyEmbeddedErrorHandler.handle(JettyEmbeddedErrorHandler.java:55) ~[spring-boot-2.0.4.RELEASE.jar:2.0.4.RELEASE]
at org.eclipse.jetty.server.Response.sendError(Response.java:655) ~[jetty-server-9.4.11.v20180605.jar:9.4.11.v20180605]
at org.eclipse.jetty.server.Response.sendError(Response.java:590) ~[jetty-server-9.4.11.v20180605.jar:9.4.11.v20180605]
at javax.servlet.http.HttpServletResponseWrapper.sendError(HttpServletResponseWrapper.java:167) ~[javax.servlet-api-3.1.0.jar:3.1.0]
at org.springframework.web.util.ContentCachingResponseWrapper.sendError(ContentCachingResponseWrapper.java:86) ~[spring-web-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver.handleHttpMessageNotReadable(DefaultHandlerExceptionResolver.java:426) ~[spring-webmvc-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver.doResolveException(DefaultHandlerExceptionResolver.java:204) [spring-webmvc-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(AbstractHandlerExceptionResolver.java:139) [spring-webmvc-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.web.servlet.handler.HandlerExceptionResolverComposite.resolveException(HandlerExceptionResolverComposite.java:78) [spring-webmvc-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.processHandlerException(DispatcherServlet.java:1255) [spring-webmvc-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1062) [spring-webmvc-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1008) [spring-webmvc-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925) [spring-webmvc-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974) [spring-webmvc-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:877) [spring-webmvc-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707) [javax.servlet-api-3.1.0.jar:3.1.0]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851) [spring-webmvc-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) [javax.servlet-api-3.1.0.jar:3.1.0]
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:865) [jetty-servlet-9.4.11.v20180605.jar:9.4.11.v20180605]
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1655) [jetty-servlet-9.4.11.v20180605.jar:9.4.11.v20180605]
at com.fe.api.routing.config.HTTPRoutesFilter.doFilter(HTTPRoutesFilter.java:384) [classes/:?]
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642) [jetty-servlet-9.4.11.v20180605.jar:9.4.11.v20180605]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) [spring-web-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642) [jetty-servlet-9.4.11.v20180605.jar:9.4.11.v20180605]
at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:109) [spring-web-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642) [jetty-servlet-9.4.11.v20180605.jar:9.4.11.v20180605]
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93) [spring-web-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642) [jetty-servlet-9.4.11.v20180605.jar:9.4.11.v20180605]
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:533) [jetty-servlet-9.4.11.v20180605.jar:9.4.11.v20180605]
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:146) [jetty-server-9.4.11.v20180605.jar:9.4.11.v20180605]
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548) [jetty-security-9.4.11.v20180605.jar:9.4.11.v20180605]
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132) [jetty-server-9.4.11.v20180605.jar:9.4.11.v20180605]
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:257) [jetty-server-9.4.11.v20180605.jar:9.4.11.v20180605]
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1595) [jetty-server-9.4.11.v20180605.jar:9.4.11.v20180605]
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255) [jetty-server-9.4.11.v20180605.jar:9.4.11.v20180605]
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1317) [jetty-server-9.4.11.v20180605.jar:9.4.11.v20180605]
org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1219) [jetty-server-9.4.11.v20180605.jar:9.4.11.v20180605]
...
Caused by: org.eclipse.jetty.io.EofException: Closed