Reputation: 163
I having a Spring bean that needs to load OpenCV native library, but I also want if it failed to load, then application still boot successfully. I've already catch exception but Spring still throw exception out and shut down application. Why Spring is throwing exception in my catch block and how can I make Spring ignore exception on initlaization? I found 1 related question here but it's quite old and haven't had any solution yet.
My code looks like this.
@Service
public class MyService {
private boolean isLoaded = false;
public MyService() {
try {
OpencvLoader.loadShared(); // load native library here
isLoaded = true;
} catch (Exception e) {
LOGGER.error("Load failed");
}
}
}
Stacktrace
Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.fptu.swp.ppr.cv.service.ObjectDetectionService]: Constructor threw exception; nested exception is java.lang.ExceptionInInitializerError
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1320)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1214)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:557)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:226)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1306)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1226)
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:885)
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:789)
... 34 common frames omitted
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.fptu.swp.ppr.cv.service.ObjectDetectionService]: Constructor threw exception; nested exception is java.lang.ExceptionInInitializerError
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:217)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:87)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1312)
... 46 common frames omitted
Caused by: java.lang.ExceptionInInitializerError: null
at com.fptu.swp.ppr.cv.utils.OpenCVLoader$SharedLoader.getInstance(OpenCVLoader.java:95)
at com.fptu.swp.ppr.cv.utils.OpenCVLoader.loadShared(OpenCVLoader.java:27)
at com.fptu.swp.ppr.cv.service.ObjectDetectionService.<init>(ObjectDetectionService.java:45)
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:204)
... 48 common frames omitted
Caused by: java.lang.NullPointerException: null
at com.fptu.swp.ppr.cv.utils.OpenCVLoader$SharedLoader.<init>(OpenCVLoader.java:55)
at com.fptu.swp.ppr.cv.utils.OpenCVLoader$SharedLoader.<init>(OpenCVLoader.java:33)
at com.fptu.swp.ppr.cv.utils.OpenCVLoader$SharedLoader$Holder.<clinit>(OpenCVLoader.java:91)
... 56 common frames omitted
Upvotes: 0
Views: 1321
Reputation: 15028
Because the loader throws an Error
, and you catch all Exception
s.
You can catch Error
, but this is usually not advisable. I doubt it is in this case, you should probably look into another solution.
Upvotes: 2