簡體   English   中英

找不到資源的類路徑/ URL

[英]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();
}

上面在控制台中打印出FALSE 在此處輸入圖片說明

我在兩個地方的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM