我正在使用Maven和Tomcat开发一个小型RESTFul项目。在我的实现中,我必须读取一个txt文件。 目前我正在测试Eclipse中的实现。使用绝对路径时,我可以毫无问题地执行我的代码。由于我必须生成一个war文件,我需要将txt文件封装在其中。使用Maven和
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<configuration>
<warSourceDirectory>WebContent</warSourceDirectory>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
我的war文件包含存储在最高级别的txt文件。你有什么建议从war文件中读取那个txt文件?我在这里找到了几个线程,但所有尝试都失败了。我需要一个规范,在Eclipse中进行测试时以及直接在Tomcat中执行时,我可以读取该文件。
在Eclipse中执行实现时,由于找不到文本文件,此代码不起作用。该文件位于WebContent文件夹中,在生成快照/战争后,您可以在war文件中找到该文件。
InputStreamFactory isf = new InputStreamFactory() {
public InputStream createInputStream() throws IOException {
return new FileInputStream("/text_de.txt");
}
};
在没有访问权限的情况下在Eclipse中执行实现时我也尝试了以下操作(我知道,这会在执行war文件时导致错误):
return new FileInputStream("/WebContent/text_de.txt");
更新:
现在我可以成功地在Eclipse中执行实现。我首先尝试使用注释@Resource,但更改为@Context
@Context
ServletContext servletContext;
然后,我添加了这一行:
String fileLocation = System.getProperty("com.example.resourceLocation",servletContext.getRealPath("/text_de.txt"));
由于
答案 0 :(得分:2)
我不确定这对您的情况是否有帮助,但您可以使用doGet()(doPost()或其他人中的HttpServletRequest request
来尝试:
return new FileInputStream(request.getServletContext().getRealPath("/text_de.txt"));
如果使用解压缩程序提取.war文件,则可以确定所需的路径,如果&#34; /text_de.txt"可能不正确,但很多时候/ WebContent /的内容最终都出现在.war文件的根目录中......
希望这会有所帮助,
注意:它本身的HttpServletRequest有一个名称相同的方法,但是这个方法已被弃用,所以你知道它是错误的。
在评论中讨论后:
在开发过程中需要一个不同的位置,
找到实际运行的tomcat实例的文件:tomcat / conf / catalina.properties。我不确定Eclipse是否正在运行它,或者您将Eclipse指向tomcat-home文件夹
添加com.example.resourceLocation=/full/path/to/eclipse/project/text_de.txt
比使用类似的东西:
String fileLocation = System.getProperty(
"com.example.resourceLocation",
request.getServletContext().getRealPath("/text_de.txt"));
//this second parameter is a default value you can provide yourself
//if the property does not exists it chooses the second as return value
响应非servlet问题:
我正在使用Jersey link,我在这里使用类似的东西
@Context
private HttpServletRequest httpRequest;
@GET
@Path("file")
@Produces(MediaType.APPLICATION_JSON)
public Response getFile () {
String fileLocation = System.getProperty(
"com.example.resourceLocation",
this.httpRequest.getServletContext().getRealPath("/text_de.txt"));
//this second parameter is a default value you can provide yourself
//if the property does not exists it chooses the second as return value
// do something with fileLocation
FileInputStream fi = new FileInputStream(fileLocation);
return Response.status(Response.Status.OK)
.entity("body")
.build();
}
在响应的@POST或@GET等函数所在的类中
几年前我在SOAP服务中使用了servlet过滤器并从doFilter()函数中检索了请求对象,
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
this.context = request.getServletContext( );
Eclipse可以使用项目的上下文菜单创建过滤器......
在这两种情况下你都有servletRequest对象或servletContext对象,所以你可以将它放到文件阅读器位置解决方案中
亲切的问候