内容简介:最近在在使用@Value注入文件碰到如下问题: 工程在在IntelliJ IDEA开发环境里正常运行,但是一旦将工程打包成jar包运行,就报java.io.FileNotFoundException: class path resource错代码如下:通过@Value将resource目录下test/billingconfig-file.xml目录注入到Resource上代码在IntelliJ IDEA开发环境里正常运行,但是一旦将工程打包成jar包运行,就提示如下错误:
最近在在使用@Value注入文件碰到如下问题: 工程在在IntelliJ IDEA开发环境里正常运行,但是一旦将工程打包成jar包运行,就报java.io.FileNotFoundException: class path resource错
代码如下:通过@Value将resource目录下test/billingconfig-file.xml目录注入到Resource上
@Value("classpath:test/billingconfig-file.xml") private Resource resourceFile; // 注入计费点文件资源 JAXBContext context = JAXBContext.newInstance(BillingModelList.class); Unmarshaller unmarshaller = context.createUnmarshaller(); BillingModelList billingModelList = (BillingModelList) unmarshaller.unmarshal(resourceFile.getFile()); 复制代码
代码在IntelliJ IDEA开发环境里正常运行,但是一旦将工程打包成jar包运行,就提示如下错误:
java.io.FileNotFoundException: class path resource [test/billingconfig-file.xml] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/C:/Users/Administrator/Desktop/tmp/other/sp-bap-simulator-1.5.17.RELEASE.jar!/BOOT-INF/classes!/test/billingconfig-file.xml at org.springframework.util.ResourceUtils.getFile(ResourceUtils.java:215) at org.springframework.core.io.AbstractFileResolvingResource.getFile(AbstractFileResolvingResource.java:52) at im.yixin.spbap.logic.support.PayContext.init(PayContext.java:63) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:366) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:311) 复制代码
原因是因为unmarshaller.unmarshal传入的参数是File,在IntelliJ IDEA里运行时,billingconfig-file.xml是个独立的文件,可以被File访问到, 但是将工程打包成jar包运行,billingconfig-file.xml被封装到jar包中了,不是一个独立文件了,此时肯定无法使用File访问到。 了解了原因,我们可以将传递unmarshaller.unmarshal()方法的参数从File变成InputStream就可以了
将 unmarshaller.unmarshal(resourceFile.getFile()); 修改为: unmarshaller.unmarshal(resourceFile.getInputStream()); 复制代码
完整代码如下:
@Value("classpath:test/billingconfig-file.xml") private Resource resourceFile; // 注入计费点文件资源 JAXBContext context = JAXBContext.newInstance(BillingModelList.class); Unmarshaller unmarshaller = context.createUnmarshaller(); BillingModelList billingModelList = (BillingModelList) unmarshaller.unmarshal(resourceFile.getInputStream()) 复制代码
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。