【发布时间】:2017-07-11 20:19:48
【问题描述】:
在我的 Spring 3.0 应用程序中,我在 /WEB-INF/dir 中有一些资源。在运行时,我需要其中一些作为InputStream(或其他类型)。我怎样才能找回它们?是否可以将它们作为普通的Resource 注入?
【问题讨论】:
在我的 Spring 3.0 应用程序中,我在 /WEB-INF/dir 中有一些资源。在运行时,我需要其中一些作为InputStream(或其他类型)。我怎样才能找回它们?是否可以将它们作为普通的Resource 注入?
【问题讨论】:
这是一个通过注释最简单的方法:
import org.springframework.core.io.Resource;
@Value("classpath:<path to file>")
private Resource cert;
【讨论】:
根据定义,所有ApplicationContexts 都是ResourceLoaders。这意味着它们能够解析在其配置中找到的任何资源字符串。考虑到这一点,您可以使用接受org.springframework.core.io.Resource 的setter 声明您的目标bean。然后在配置目标 bean 时,只需在属性值中使用资源路径即可。 Spring 将尝试将配置中的String 值转换为Resource。
public class Target {
private Resource resource;
public void setResource(final Resource resource) {
this.resource = resource;
}
}
//configuration
<beans>
<bean id="target" class="Target">
<property name="resource" value="classpath:path/to/file"/>
</bean>
</beans>
【讨论】:
你应该可以使用:
Resource resource = appContext.getResource("classpath:<your resource name>");
InputStream is = resource.getInputStream();
appContext 是你的 Spring ApplicationContext(特别是 WebApplicationContext,因为你有一个 webapp)
【讨论】:
Resource 接口没有声明getInputStream() 方法,您需要调用new FileInputStream(resource.getFile())。
Resource继承自接口org.springframework.core.io.InputStreamSource
implements。
这是一个检索类路径资源的完整示例。我用它来抓取具有我不想存储在 Java 类中的非常复杂的查询的 SQL 文件:
public String getSqlFileContents(String fileName) {
StringBuffer sb = new StringBuffer();
try {
Resource resource = new ClassPathResource(fileName);
DataInputStream in = new DataInputStream(resource.getInputStream());
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String strLine;
while ((strLine = br.readLine()) != null) {
sb.append(" " + strLine);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return sb.toString();
}
【讨论】:
try-with-resources。
如果您不想引入对 Spring 的依赖,请按照此处详述的方法: Populate Spring Bean's File field via Annotation
【讨论】: