Spring Boot 如何防止Sping Boot App启动

vql8enpb  于 2023-05-06  发布在  Spring
关注(0)|答案(3)|浏览(260)

如果无法注入Resource,如何阻止应用启动?
我注意到,无论路径是否存在,应用程序都会启动:

@Value("classpath:insurance/template/insurance_policy.docx")
private Resource insuranceTemplate;

如果路径不存在,如何防止应用启动?

0vvn1miw

0vvn1miw1#

如果无法通过在初始化期间引发异常来注入资源,则可以阻止应用程序启动。实现此目的的一种方法是在应用程序的配置或启动类中的方法上使用@PostConstruct注解,如下所示:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;

import javax.annotation.PostConstruct;

@Configuration
public class AppConfig {

    @Autowired
    private Resource insuranceTemplate;

    @PostConstruct
    public void validateResource() {
        if (!insuranceTemplate.exists()) {
            throw new IllegalStateException("Insurance template not found");
        }
    }
}

validateResource()方法被注解为@PostConstruct,这意味着它将在所有依赖项都被注入之后被调用。该方法检查insuranceTemplate资源是否存在,如果不存在,则抛出异常。这将阻止应用程序启动。
如果您使用的是Spring Framework和org.springframework.core.io包中的Resource接口,则可以使用此方法。

57hvy0tb

57hvy0tb2#

构造函数注入是一种更好的方法。它简化了编写单元测试,并强制通过所有必要的依赖项,一旦我们创建了bean,我们就不能再改变它的依赖项。
下面你可以找到示例代码:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;

@Configuration
public class InsuranceConfiguration {

    @Bean
    InsuranceFacade insuranceService(@Value("${:classpath:test.txt}")Resource resource){
        return new InsuranceFacade(resource);
    }

}
import org.springframework.core.io.Resource;

import static com.google.common.base.Preconditions.*;

public class InsuranceFacade {

    private final Resource resource;

    public InsuranceFacade(final Resource resource) {
        checkArgument(resource.exists(), "resource cannot be null");
        this.resource = resource;
    }
}
qjp7pelc

qjp7pelc3#

同时,我用以下方法解决了这个问题:

private Resource insuranceTemplate;

public InsuranceService(
...
@Value("classpath:insurance/template/insurance_policy2.docx") Resource insuranceTemplate
) {
...
        this.insuranceTemplate=insuranceTemplate;
        if (!insuranceTemplate.exists()){
            throw new IllegalStateException("Insurance template not found");
        }
}

从服务构造函数引发异常

相关问题