Spring中的类路径问题:找不到文件异常

用户1548875

我有一个简单的Java Spring IO项目,其中的一个类应该从csv文件读取,对于每个读取的记录,参数都存储在帐户对象列表中。我正在使用Force IDE Luna,并且读取文件的CsvAccountDao类与xml文件的第一个bean中定义的csv文件位于同一包中。xml文件也位于同一程序包下。这是Bean文件:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="https://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">

    <bean id="accountDao"
    class="com.springinpractice.ch01.model.dao.csv.CsvAccountDao">
    <property name="csvResource" value="accounts.csv"></property>
    </bean>
    <bean id="accountService"
            class="com.springinpractice.ch01.service.AccountService">
            <property name="accountDao" ref="accountDao"</property>     
        </bean>
</beans>

这是类文件CscAccountDao:

package com.springinpractice.ch01.model.dao.csv;
import java.io.BufferedReader;
import java.io.FileReader;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.springframework.core.io.Resource;
import com.springinpractice.ch01.model.Account;
import com.springinpractice.ch01.model.dao.AccountDao;

public class CsvAccountDao implements AccountDao {
    private Resource csvResource;

    public CsvAccountDao() {
        // TODO Auto-generated constructor stub
    }
    public void setCsvResource(Resource csvFile){
        this.csvResource = csvFile;
    }
    @Override
    public List<Account> findAll() throws Exception {
        List<Account> results = new ArrayList<Account>();

        DateFormat fmt = new SimpleDateFormat("MMddyyyy");
        BufferedReader br = new BufferedReader(
                new FileReader(csvResource.getFile()));
        String line;
        while((line = br.readLine()) != null){
            String[] fields = line.split(",");

            String accountNo = fields[0];
            BigDecimal balance = new BigDecimal(fields[1]);
            Date lastPaidOn = fmt.parse(fields[2]);
            Account account =
                        new Account(accountNo, balance, lastPaidOn);
            results.add(account);
        }
        br.close();
        return results;
    }
}

请注意,方法setCsvResource将csv文件分配给资源对象的位置是异常问题开始的地方。我在堆栈跟踪中得到一个异常错误,内容为:

Jun 20, 2015 7:59:42 PM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@177e4b0: defining beans [accountDao,accountService]; root of factory hierarchy
Exception in thread "main" java.io.FileNotFoundException: class path resource [accounts.csv] cannot be resolved to URL because it does not exist

问)是否存在问题,我必须通过添加完整路径来更新第一个bean使用accounts.csv的XML文件?由于class,xml和csv文件都在同一个包中,所以我认为我不需要更具体了。

罗比

关于资源加载的一些背景。

在Java中,要加载类路径资源,请使用资源名称调用getResourcegetResourceAsStream在类加载器上进行调用资源名称为:

资源的名称是用“ /”分隔的路径名,用于标识资源。

因此,要从包中获取资源,请使用:

classloader.getResource("org/com/resource.jpg")

Java类还具有从其类加载器加载资源的便捷方法。如果使用ClassA.class.getResource("resource.jpg"),它将在ClassA的“ /”连接包的前面加上“ resource.jpg”,并委托给类加载器。如果您的资源字符串以“ /”开头,则将其解释为绝对路径,将删除开头的“ /”,然后将其委托给类加载器。

因此,接下来我们开始为您提供accounts.csv要转换为资源的值。Spring用于DefaultResourceLoader查找您的资源。这是用于查找资源的逻辑:

@Override
public Resource getResource(String location) {
    Assert.notNull(location, "Location must not be null");
    if (location.startsWith("/")) {
        return getResourceByPath(location);
    }
    else if (location.startsWith(CLASSPATH_URL_PREFIX)) {
        return new ClassPathResource(location.substring(CLASSPATH_URL_PREFIX.length()), getClassLoader());
    }
    else {
        try {
            // Try to parse the location as a URL...
            URL url = new URL(location);
            return new UrlResource(url);
        }
        catch (MalformedURLException ex) {
            // No URL -> resolve as resource path.
            return getResourceByPath(location);
        }
    }
}

在您的情况下,它一直贯穿到catch(MalformedURLException ex),然后尝试将其查找为类路径资源。当最终要求ClasspathResource提供URL或输入流时,它将传递"account.csv"给类加载器。类加载器正在类路径的根目录中寻找它。

因此,在您的spring xml中,您需要告诉它它所在的包。它不会相对于xml。因此,将其更改为“ /package/account.csv”或“ classpath:/package/account.csv”

供参考:我正在查看Spring 4.0.9.RELEASE和oracle jdk8。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在类路径文件中找不到自动测试的问题

来自分类Dev

Spring 在类路径中找不到文件,但它就在 war 文件的根目录中

来自分类Dev

Spring Boot多模块Gradle项目类路径问题:找不到包,找不到符号

来自分类Dev

在类路径中找不到类:(ClassName)

来自分类Dev

以编程方式运行TestNG,获取“在类路径中找不到类”异常

来自分类Dev

编译后找不到类路径文件

来自分类Dev

即使在类路径中包含jar,也找不到Eclipse Class异常

来自分类Dev

Junit(JAVA)中找不到类异常

来自分类Dev

android中找不到类异常

来自分类Dev

在类路径中找不到功能:/ cucumberOptions

来自分类Dev

在laravel中找不到类路径

来自分类Dev

路径DexPathList上找不到类GCMIntentServices异常

来自分类Dev

在类路径中找不到类:即使在 testng.xml 中提到了类的完整层次结构,也会引发异常

来自分类Dev

在laravel 5.2的路径中找不到文件

来自分类Dev

在声明的路径中找不到文件

来自分类Dev

在声明的路径中找不到文件

来自分类Dev

从路径编码图像时找不到文件异常

来自分类Dev

Maven / Eclipse:在类路径中找不到任何META-INF / persistence.xml文件

来自分类Dev

在类路径中找不到Flash类定义

来自分类Dev

TestNG:在类路径testng.xml中找不到类

来自分类Dev

TestNG-在类路径中找不到类

来自分类Dev

复制本地=找不到错误文件异常问题

来自分类Dev

找不到包含文件中的php类

来自分类Dev

找不到类异常-puppet

来自分类Dev

找不到类异常错误

来自分类Dev

找不到类异常-puppet

来自分类Dev

找不到Hadoop类异常

来自分类Dev

在 HBASE 中创建表时找不到类异常

来自分类Dev

在Android中找不到文件的Toast文件异常

Related 相关文章

热门标签

归档