[英]Unable to find classpath/URL for Resource
我找不到我的xml文件的文件/類路徑。 我已經嘗試過絕對路徑並彈奏classpath*:
ApplicationContext ctx =
new ClassPathXmlApplicationContext();
private Resource resource = this.ctx.getResource("classpath*:validation.xml");
在構造函數中,我有:
public Validator() {
if(this.resource.exists()){
System.out.println("FOUND!!!!!!!!!!!!!!!!!!!!"+resource);
}else{
System.out.println("NOT FOUND");
}
this.runInputStream();
}
我在兩個地方的validation.xml
文件使用不同的名稱。 我試圖弄清楚沒有加載或找不到它的位置和原因。
我在GIT 上發布了該項目。
---------------------更新1 ---------------------------
我已將以下內容添加到我的pom
文件中:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.1.0</version>
</plugin>
</plugins>
</build>
它似乎已經找到/被初始化了,但是該類沒有被初始化,就像以前一樣,它給了我一個空指針異常。
更新的代碼:
@Configuration
public class Validator {
private InputStream forms;
private ValidatorResources resources;
private Resource validationResource;
ApplicationContext ctx =
new ClassPathXmlApplicationContext();
@PostConstruct
public void init(){
validationResource = ctx.getResource("classpath*:validation.xml");
}
public Validator() {
this.runInputStream();
}
private void runInputStream(){
try{
this.forms = this.validationResource.getInputStream();
this.resources = new ValidatorResources(this.forms);
}catch (IOException ex) {
System.out.println("Error in Validator.Class-----runInputStream IOException: "+ex);
}catch (SAXException e) {
System.out.println("Error in Validator.Class-----runInputStream SAXException: "+e);
}catch (Exception e){
System.out.println("Error in Validator.Class-----------"+e);
}
}
}
問題是src / main / resources / validation.xml沒有打包到war文件中。
用以下內容替換pom中的<build>部分:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.1.0</version>
</plugin>
</plugins>
</build>
這樣,所有Maven項目的默認資源目錄src / main / resources最終將位於target / classes和WAR的WEB-INF / classes中。
首先刪除尾隨/資源部分。 資源部分應相對於構建目錄。
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/webapp/WEB-INF/config</directory>
</resource>
</resources>
</build>
接下來修改您的Validator.java
@Configuration
public class Validator implements InitializingBean {
@Autowired
private ApplicationContext applicationContext;
@Override
public void afterPropertiesSet() throws Exception {
Resource resource = applicationContext.getResource("validation.xml");
if(this.resource.exists()){
System.out.println("FOUND!!!!!!!!!!!!!!!!!!!!"+resource);
}else{
System.out.println("NOT FOUND");
}
}
有關更多詳細信息,請參見InitializingBean 。 另一種方法是像這樣使用ApplicationContextAware:
@Configuration
public class Validator implements ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
Resource resource = applicationContext.getResource("classpath:validation.xml");
if(this.resource.exists()){
System.out.println("FOUND!!!!!!!!!!!!!!!!!!!!"+resource);
}else{
System.out.println("NOT FOUND");
}
}
構建項目,然后將戰爭部署在tomcat中。 你應該看到類似
22-May-2017 10:57:38.658 INFO [localhost-startStop-1] org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions Loading XML bean definitions from ServletContext resource [/WEB-INF/config/application-context.xml] FOUND!!!!!!!!!!!!!!!!!!!!class path resource [validation.xml]
我注意到的第一件事是您正在嘗試在現場一級獲取資源。 換句話說,這是:
public class SomeClass{
ApplicationContext ctx = new ClassPathXmlApplicationContext();
private Resource resource = this.ctx.getResource("classpath:validation.xml");
}
讓我認為應用程序上下文尚未完全初始化。
拉下您的項目並檢查后,我的假設是正確的。 直到類初始化之后, ApplicationContext
才被完全初始化。 要解決這個問題,可以使用@PostConstruct
批注。 您的班級現在看起來像這樣:
@Configuration
public class Validator {
@Autowired
private ApplicationContext applicationContext;
private Resource validationResource;
@PostConstruct
public void init(){
validationResource = applicationContext.getResource("classpath*:validation.xml");
}
附帶一提,我建議您花一些時間正確配置pom。 理想情況下,某人應該能夠刪除您的代碼,進行構建並運行。 由於手動配置,我花了一些時間才能使您的項目在本地運行。
您可以嘗試:
URL resource = ClassLoader.getSystemClassLoader().getResource("validation.xml");
如果可以使用URL
,則可以從中獲取Resource
。 如果找不到資源,它將返回null。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.