minhtus
minhtus

Reputation: 163

Continue on fail Spring bean initialization

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

Answers (1)

daniu
daniu

Reputation: 15028

Because the loader throws an Error, and you catch all Exceptions.

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

Related Questions