如果无法注入Resource,如何阻止应用启动?我注意到,无论路径是否存在,应用程序都会启动:
Resource
@Value("classpath:insurance/template/insurance_policy.docx") private Resource insuranceTemplate;
如果路径不存在,如何防止应用启动?
0vvn1miw1#
如果无法通过在初始化期间引发异常来注入资源,则可以阻止应用程序启动。实现此目的的一种方法是在应用程序的配置或启动类中的方法上使用@PostConstruct注解,如下所示:
@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接口,则可以使用此方法。
validateResource()
insuranceTemplate
org.springframework.core.io
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; } }
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"); } }
从服务构造函数引发异常
3条答案
按热度按时间0vvn1miw1#
如果无法通过在初始化期间引发异常来注入资源,则可以阻止应用程序启动。实现此目的的一种方法是在应用程序的配置或启动类中的方法上使用
@PostConstruct
注解,如下所示:validateResource()
方法被注解为@PostConstruct
,这意味着它将在所有依赖项都被注入之后被调用。该方法检查insuranceTemplate
资源是否存在,如果不存在,则抛出异常。这将阻止应用程序启动。如果您使用的是Spring Framework和
org.springframework.core.io
包中的Resource接口,则可以使用此方法。57hvy0tb2#
构造函数注入是一种更好的方法。它简化了编写单元测试,并强制通过所有必要的依赖项,一旦我们创建了bean,我们就不能再改变它的依赖项。
下面你可以找到示例代码:
qjp7pelc3#
同时,我用以下方法解决了这个问题:
从服务构造函数引发异常