Spring (mvc, websockets) 在创建实例时有时会引发异常

5

在我们的生产(tomcat,java8)服务器上,有时候,我们会在日志文件中看到以下堆栈跟踪:

java.lang.Exception
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:142)
        at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:102)
        at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.createAttribute(ModelAttributeMethodProcessor.java:139)
        at org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor.createAttribute(ServletModelAttributeMethodProcessor.java:82)
        at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:106)
        at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121)
        at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:158)
        at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:128)
        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
        at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
        at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
        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 org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:728)
        at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:591)
        at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:527)
        at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:380)
        at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:323)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:166)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
        at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:660)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:798)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:806)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:748)

这个异常的原因是什么,我如何追踪它的来源?

谢谢


尝试启用错误以获取更多日志。您当前的日志并没有帮助! - JRichardsz
2个回答

0

目前我面前没有 Spring MVC 代码,但是看起来似乎出现了错误的端点。

ModelAttributeMethodProcessor 尝试创建一个模型属性(基本上应该是你代码中的某些东西,这个类应该有构造函数),但无法实例化它。

这种情况下可能会响应 500 http 状态码(或者至少不是 200)。现在,你可能在某个地方拥有访问日志(包含所有请求/响应状态的日志) - 这可以是网关、应用程序负载均衡器、ELB 等,这实际上取决于你的运行环境。在这种情况下,你可以检查这些日志,并尝试找到有时返回 5XX 代码的端点。也许会出现相同的端点有时不能正常工作。如你所说,这应该不会对服务器造成问题,但期望通过调用此端点获得结果的客户端显然没有得到所需的响应。


0

基于例如:Spring Boot自定义错误控制器显示不正确的异常,这可能是您自己代码中抛出的异常,因此可以在自己的代码库中搜索抛出异常的位置。

稍微复杂一些的是,所有这些都是在本地代码中实现的,请参见:class newInstance传播已检查和未检查的异常-是否属实?

但是,也许更加混淆的是,由于原始异常在您的生产系统上已经生成了很多次(自启动以来),并且已转换为极其优化的本地代码。

在这种情况下,您可以:

  • 在应用程序刚启动时在日志中查看;或者
  • 如果您使用此额外参数启动Java:-XX:-OmitStackTraceInFastThrow(在应用程序jar / Main类名称和应用程序参数之前)

我希望这有所帮助,我很好奇是否是这种情况,因此请让我(以及可能稍后到达此处的所有其他读者)知道。


1
感谢@JohannesB,我们目前怀疑是管道损坏或类似的异常。幸运的是,这个异常本身并不会造成任何问题,只会污染日志文件。我们将在我们的演示环境上配置XX参数,该参数显示相同的异常。如果我们有更多的见解,我会在这里回复。 - Marius
1
更新:我已添加了一个exceptionResolver,并能够记录实际的异常,这些异常在初始化websocket时是断开的。 - Marius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接