前言

Spring4+ mybatis3+springMVC。maven管理项目。在做支付项目需要用到密钥文件。需要在service中读取密钥文件路径。通用做法把密钥文件放到src/main/resources/common/aaa.pfx。在读取文件路径时遇到问题

方法一

做过文件下载想到用绝对路径拿到密钥文件在服务器上的路径。
需要通过HttpServletRequest request 来得到realPath。

  1. request需要从action作为参数传过来,否则在service中拿不到。
  2. getRealPath已经不推荐使用单元测试时会报异常。
  3. 拿到的路径需要再次加工E:/study/My-FH-workspace/pm/web-app 这个是得到的项目路径,放在resource中的密钥文件在web-app/WEB_INF/classes/common/aaa.pfx

方法二

通过spring提供强大的配置文件加载路径读取功能获得密钥文件路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
//只加载一个绝对匹配Resource,且通过ResourceLoader.getResource进行加载
Resource[] resources=resolver.getResources("classpath:META-INF/INDEX.LIST");
Assert.assertEquals(1, resources.length);
//只加载一个匹配的Resource,且通过ResourceLoader.getResource进行加载
resources = resolver.getResources("classpath:common/aaa.pfx");
Assert.assertTrue(resources.length == 1);
URL path = resources[0].getURL();
//获取文件的绝对路径
String pathStr = path.getPath().substring(1);

引申到Spring资源加载

资源文件分为两种

  1. 打包后放在classes下面的。在maven中放在src/main/resources/下面的。
    用spring加载配置文件的方式读取
  2. 放在项目根目录下的。request.getrealPath()的方式读取
  3. 放在WEB-INF下的。request.getrealPath()的方式读取

Spring 支持antPattern风格的资源路径匹配。在加载类路径资源时提供前缀”classpath:”还提供一种加载所有匹配写法”classpath*:”

注入reource
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<bean id="resourceBean1" class="cn.javass.spring.chapter4.bean.ResourceBean4">
<property name="resources">
<array>
<value>cn/javass/spring/chapter4/test1.properties</value>
<value>log4j.xml</value>
</array>
</property>
</bean>
<bean id="resourceBean2" class="cn.javass.spring.chapter4.bean.ResourceBean4">
<property name="resources" value="classpath*:META-INF/INDEX.LIST"/>
</bean>
<bean id="resourceBean3" class="cn.javass.spring.chapter4.bean.ResourceBean4">
<property name="resources">
<array>
<value>cn/javass/spring/chapter4/test1.properties</value>
<value>classpath*:META-INF/INDEX.LIST</value>
</array>
</property>
</bean>

主要介绍第二种resourceBean2可以在需要读取resource配置文件尤其是properties中使用