发布请求后的无限循环



我有一个运行上下文myContext的 spring 启动和一个带有方法的 rest 控制器

@RestController
@RequestMapping("/api/v1")
@Slf4j
public class MyController {
@SecurityRequirement(name = "OpenId")
@PostMapping(path = "/record/import", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<String> importRecord(@RequestBody RecordJson importBody, Authentication auth, Locale locale) throws ParseException {
...
}
}

当我向邮递员提出请求时:POST localhost:8080/myContext/api/v1/record/import

应用程序陷入无限循环:

2023-04-03 14:57:39.136  INFO 22976 --- [)-192.168.0.111] o.a.c.c.C.[.[localhost].[/myContext]     : Initializing Spring DispatcherServlet 'dispatcherServlet'
2023-04-03 14:57:39.136  INFO 22976 --- [)-192.168.0.111] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2023-04-03 14:57:39.139  INFO 22976 --- [)-192.168.0.111] o.s.web.servlet.DispatcherServlet        : Completed initialization in 3 ms
2023-04-03 14:57:45.229  WARN 22976 --- [nio-8080-exec-1] o.s.web.servlet.PageNotFound             : No mapping for POST /myContext/
2023-04-03 14:57:45.232  INFO 22976 --- [nio-8080-exec-1] c.n.a.e.c.ForwardConfiguration           : No requested mapping found. Forwarding to index
2023-04-03 14:57:45.229  WARN 22976 --- [nio-8080-exec-1] o.s.web.servlet.PageNotFound             : No mapping for POST /myContext/
2023-04-03 14:57:45.232  INFO 22976 --- [nio-8080-exec-1] c.n.a.e.c.ForwardConfiguration           : No requested mapping found. Forwarding to index
2023-04-03 14:57:45.229  WARN 22976 --- [nio-8080-exec-1] o.s.web.servlet.PageNotFound             : No mapping for POST /myContext/
2023-04-03 14:57:45.232  INFO 22976 --- [nio-8080-exec-1] c.n.a.e.c.ForwardConfiguration           : No requested mapping found. Forwarding to index
... repeating of two above lines

直到它以重复堆栈条目的 StackOverflow ex 完成:

2023-04-03 14:57:46.534  INFO 22976 --- [nio-8080-exec-1] c.n.a.e.c.ForwardConfiguration           : No requested mapping found. Forwarding to index
2023-04-03 14:57:46.545  WARN 22976 --- [nio-8080-exec-1] o.s.web.servlet.PageNotFound             : No mapping for POST /myContext/
2023-04-03 14:57:46.546  INFO 22976 --- [nio-8080-exec-1] c.n.a.e.c.ForwardConfiguration           : No requested mapping found. Forwarding to index
Disconnected from the target VM, address: '127.0.0.1:51491', transport: 'socket'
2023-04-03 14:58:10.378 ERROR 22976 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[.[dispatcherServlet]      : Servlet.service() for servlet [dispatcherServlet] threw exception
java.lang.StackOverflowError: null
at java.base/java.util.concurrent.ConcurrentHashMap.putVal(ConcurrentHashMap.java:1012)
at java.base/java.util.concurrent.ConcurrentHashMap.put(ConcurrentHashMap.java:1006)
at org.apache.catalina.connector.Request.setAttribute(Request.java:1584)
at org.apache.catalina.connector.RequestFacade.setAttribute(RequestFacade.java:540)
at org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:306)
at org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:306)
at org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:306)
at org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:306)
...... repeating many lines of setAttribute 
at org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:306)
at org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:306)
at org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:306)
at javax.servlet.ServletRequestWrapper.setAttribute(ServletRequestWrapper.java:259)
at javax.servlet.ServletRequestWrapper.setAttribute(ServletRequestWrapper.java:259)
at javax.servlet.ServletRequestWrapper.setAttribute(ServletRequestWrapper.java:259)
at javax.servlet.ServletRequestWrapper.setAttribute(ServletRequestWrapper.java:259)
at javax.servlet.ServletRequestWrapper.setAttribute(ServletRequestWrapper.java:259)
at javax.servlet.ServletRequestWrapper.setAttribute(ServletRequestWrapper.java:259)
at org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper.setAttribute(ResourceUrlEncodingFilter.java:87)
at javax.servlet.ServletRequestWrapper.setAttribute(ServletRequestWrapper.java:259)
at org.springframework.web.servlet.mvc.condition.ProducesRequestCondition.getAcceptedMediaTypes(ProducesRequestCondition.java:287)
at org.springframework.web.servlet.mvc.condition.ProducesRequestCondition.getMatchingCondition(ProducesRequestCondition.java:208)
at org.springframework.web.servlet.mvc.method.RequestMappingInfo.getMatchingCondition(RequestMappingInfo.java:393)
at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getMatchingMapping(RequestMappingInfoHandlerMapping.java:109)
at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getMatchingMapping(RequestMappingInfoHandlerMapping.java:67)
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.addMatchingMappings(AbstractHandlerMethodMapping.java:448)
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:408)
at org.springframework.data.rest.webmvc.BasePathAwareHandlerMapping.lookupHandlerMethod(BasePathAwareHandlerMapping.java:103)
at org.springframework.data.rest.webmvc.RepositoryRestHandlerMapping.lookupHandlerMethod(RepositoryRestHandlerMapping.java:147)
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:383)
at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:125)
at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:67)
at org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:498)
at org.springframework.data.rest.webmvc.config.DelegatingHandlerMapping$HandlerSelectionResult.from(DelegatingHandlerMapping.java:147)
at org.springframework.data.rest.webmvc.config.DelegatingHandlerMapping.getHandler(DelegatingHandlerMapping.java:114)
at org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1261)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1043)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:681)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:102)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:711)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:459)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:385)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:313)
at org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper$SessionCommittingRequestDispatcher.forward(SessionRepositoryFilter.java:412)
at org.springframework.security.web.header.HeaderWriterFilter$HeaderWriterRequestDispatcher.forward(HeaderWriterFilter.java:170)
at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:171)
at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:316)
at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1401)
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1145)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1084)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:681)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:102)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:711)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:459)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:385)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:313)
at org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper$SessionCommittingRequestDispatcher.forward(SessionRepositoryFilter.java:412)
at org.springframework.security.web.header.HeaderWriterFilter$HeaderWriterRequestDispatcher.forward(HeaderWriterFilter.java:170)
at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:171)

... repeating blocks of stacktrace

该控制器中的其他 rest 端点工作正常。上下文在application.properties中设置。

似乎我有两个问题。

  1. Spring 无法将请求正确映射到我的控制器。
  2. 无映射方法异常处理不知何故被破坏,并一次又一次地将自身重定向到同一 URL。

在 Spring Boot 中,默认情况下,您的上下文不是/AppName。您的上下文仅为/。

所以试试这个:POST localhost:8080/api/v1/record/import

如果要更改默认上下文,则必须执行以下步骤:

1.)插入pom.xml行:<finalName>myContext</finalName>

例如:

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<finalName>myContext</finalName>
</build>

2.) 在应用程序属性中插入以下行:server.servlet.context-path=/myContext

3.) 如果您在项目 -> 属性 -> 运行 -上使用 Netbeans -> Rightklick>请在上下文路径中插入上下文名称,例如"/myContext">

就是这样,我希望这有帮助

我发现,我们项目中的一个依赖项有一个@ControllerAdvice标记的类,它通过重定向到"/"来处理NoHandlerFoundException.class,这不存在并导致重定向处理再次和无限循环。

如果有人有类似的问题,请寻找NoHandlerFoundException.class处理。

最新更新