2017-07-10 22 views
0

私はMavenとTomcatを備えた小さなRESTFulプロジェクトに取り組んでいます。私の実装の中では、私はtxtファイルを読む必要があります。 現在、Eclipseで実装をテストしています。絶対パスを使用するときは、問題なくコードを実行できます。 warファイルを生成する必要があるので、txtファイルをカプセル化する必要があります。 Mavenを使用してWAR内のファイルを読む

<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を生成した後、ファイルをwarファイルに格納します。

  InputStreamFactory isf = new InputStreamFactory() { 
      public InputStream createInputStream() throws IOException { 
       return new FileInputStream("/text_de.txt"); 
      } 
     }; 

私も(warファイルの実行時にエラーにつながること、私が知っている)にアクセスすることなく、Eclipseでの実装を実行する場合は、次の試してみました:

return new FileInputStream("/WebContent/text_de.txt"); 

UPDATE:

これでEclipse内の実装を成功させることができます。私が最初に注釈@Resourceでそれを試してみましたが、その後@Context

@Context 
ServletContext servletContext; 

に変更し、私はこの行を追加:

String fileLocation = System.getProperty("com.example.resourceLocation",servletContext.getRealPath("/text_de.txt")); 

おかげ

答えて

2

を、これはあなたに助け場合、私はわかりません場合、しかし、あなたは、あなたのdoGet()(のdoPost()、または他の1)からHttpServletRequest requestを使用して、試みることができる:

return new FileInputStream(request.getServletContext().getRealPath("/text_de.txt")); 

解凍プログラムを使用して.warファイルを解凍すると、 "/text_de.txt"が正しくないかもしれないが、/ WebContent /の内容が.warファイル...

ホープスこれは、

ノートに役立ちます:HttpServletRequestのそれは自己が同じ名前のメソッドを持っていますが、その一つは推奨されませんので、あなたはそれを間違ったものを知っているだろうし。

コメントでの議論の後に:実際に実行されているのTomcatのインスタンスのtomcatに/ confに/ catalina.properties:

あなたは開発中の別の場所を必要とし、

は、ファイルを見つけます。非に応じて

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  

:ようなものを使用するよりも、com.example.resourceLocation=/full/path/to/eclipse/project/text_de.txt

のような行を追加し、私は、Eclipseがこれを実行している場合はわからない、またはあなたが

のtomcat-ホームフォルダにEclipseのポイント-servlet質問:私はジャージー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などの機能が

数年前、私はサーブレットフィルタを使用するとのdoFilter()関数から要求オブジェクトを検索SOAPサービスに配置されているクラス内

ファイルリーダーの場所液にそれに合うことができるように、両方のケースで
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     this.context = request.getServletContext(); 

Eclipseは、プロジェクトのコンテキスト・メニューを使用してフィルタを作成することができます...

あなたは、ServletRequestオブジェクトまたはのServletContextオブジェクトを持っている

種類について

+0

私の仕様のため、/ WebContent /の内容は.warファイルのルートになります。私はEclipseで実装を実行できるようにしたいと思います(Tomcatを起動すると、Eclipseのサーバー用のリソースとしてプロジェクトが追加されます).warファイルを使用して実行できます。 – Matzka

+0

多分私は誤解されています、あなたはあなたが日食内の場所からファイルを読む必要があるのですか? これは、 "/Users/user/workspace/project/WebContent/text.txt" のようになります。開発マシンのシステムプロパティを使用して、プロダクションのデフォルトの状況をオーバーライドすることができます。 – mzijdemans

+0

私はサービスを開発していますEclipse内でwarファイルは別のTomcatインスタンスに統合されます。 Eclipseでテストpruposesのためのサービスを実行するときと生産システムで.warファイルを実行するときに動作するtxtファイルを読む方法が必要です。 Eclipseでプログラムを実行すると、.warファイルには触れません。読み込み操作をオーバーライドすることは良い考えのように聞こえるかもしれません。 – Matzka

関連する問題