无法找到资源的类路径/ URL

时间:2017-05-19 17:36:14

标签: java spring spring-mvc

我无法找到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();
}

上面打印出控制台中的FALSEenter image description here

我的validation.xml文件位于不同名称的两个地方。我试图找出它没有加载或被发现的地点和原因。

我在GIT上发布了该项目.... GitHub Link

---------------------更新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);
        }

    }

}

enter image description here

4 个答案:

答案 0 :(得分:1)

问题是 src / main / resources / validation.xml 未打包到war文件中。

替换&lt;构建&GT; pom中的部分:

<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将最终出现在目标/类和WAR中的WEB-INF / classes中。

答案 1 :(得分:1)

首先删除trailing / in resources部分。资源部分应该相对于构建目录。

<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中部署war。你应该看到像

这样的东西
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]

答案 2 :(得分:1)

我注意到的第一件事是你试图在现场一级获取资源。换句话说,这个:

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。理想情况下,某人应该能够下载代码,构建和运行。由于手动配置,我花了一些时间让您的项目在本地运行。

答案 3 :(得分:0)

你可以尝试:

URL resource = ClassLoader.getSystemClassLoader().getResource("validation.xml");

如果有URL可用,那么就可以获得Resource。如果没有找到资源,它将返回null。