当问题只是缺少文件资源时,Spring生成的堆栈跟踪很大且很难看:
11:25:09.757 [main] INFO c.m.m.MarketDataProvider - Starting service: MarketDataProvider
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'marketDataProvider' defined in file [C:\projects\myproj\assembly\target\myproj-dev\config\marketdata-ctx.xml]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: Cannot load list of symbols at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1420)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1075)
at com.myproj.marketdata.MarketDataProvider.getBean(MarketDataProvider.java:38)
at com.myproj.marketdata.MarketDataSubscriber.main(MarketDataSubscriber.java:49)
Caused by: java.lang.IllegalStateException: Cannot load list of symbols
at com.myproj.marketdata.MarketDataProvider.start(MarketDataProvider.java:56)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1544)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1485)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417)
... 9 more
Caused by: com.myproj.marketdata.SymbolLoaderException: Unable to load symbols file java.io.FileNotFoundException: File 'var/staticData/symbols.txt' not found using search path [file:/C:\projects\myproj\assembly\target\myproj-dev/]. Make sure the location is specified relative to the search path.
at com.myproj.marketdata.SymbolsFileLoader.load(SymbolsFileLoader.java:37)
at com.myproj.marketdata.MarketDataProvider.start(MarketDataProvider.java:48)
... 16 more
问题是我们的运营团队难以解析这个巨大的堆栈跟踪。他们经常会错过堆栈底部的java.io.FileNotFoundException: File 'var/staticData/symbols.txt'
。
虽然一个明显的解决方案是“训练您的运营团队阅读Java异常”,但我更希望Spring Framework能够为丢失的FileResource生成更简洁的错误。是否有这样的选项,或者我是否需要编写某种自定义文件资源适配器来“预先筛选”它们并在将它们传递给Spring之前验证它们是否存在?
答案 0 :(得分:2)
我不这么认为。顺便说一下,在你的情况下,你是FileNotFoundException
IllegalStateException
中的BeanCreationException
。
“问题”不是春天。这是例外工作的方式 - 它们会冒泡直到有人抓住它们。然后他可以选择重新抛出或包裹它们。 Spring在.. FileNotFoundException
中创建bean时失败了 - 非常合乎逻辑。
一些不可取的但有助于缩短堆栈跟踪的东西,就是你不要重新抛出异常 - 在init()
方法中捕获fatal
并将其记录为{{1} }}。让你的豆子继续和平创造。这就是“捕获和记录”方法(并不总是被认为是一种好的做法;))
答案 1 :(得分:0)
您是否考虑过为此创建自己的日志记录实现?
目前尚不清楚您使用的是哪个日志系统,但在所有日志系统中,您都可以创建自己的日志输出处理程序。该日志记录处理程序接收Exception实例。您可以遍历附加的异常以查找您要查找的FileNotFound异常。如果您发现这种情况,您可以通过将该特定问题直接置于顶部的方式进行记录。 (我也打印出堆栈跟踪,用于调试目的,但将其置于错误之下)。