2015-04-21 55 views
1

我真的很沮喪,因爲三天來我沒有在這個問題上取得任何進展。Restlet Servlet上下文總是爲空

我有一個Restlet Servlet嵌入在Tomcat v7.0服務器中。除了訪問ServletContext外,一切都按預期工作。

我的目標是讀取位於WEB-INF中的文件,位於web.xml的位置。

Deployment Resources 
WebContent 
    log 
    META-INF 
    WEB-INF 
     lib 
     textFileToRead.txt <----- 
     web.xml 

爲了達到這個目的,我需要訪問ServletContext。我嘗試了所有可以通過網絡找到的代碼,但是由於事實,我沒有預料到會發生什麼事情。我正在使用Restlet 2.0 je e,並且爲Restlet 1.0 jee製作了一些示例。

這裏是我嘗試訪問上下文:

Context c = this.getContext(); 

我調試它,並取得了變量 「c」 的從上面Screenshop:

https://www.dropbox.com/s/b31a52l3w8xifgg/context_full.PNG?dl=0

正如你可以看到「上下文」「ServerDispatcher」的變量爲空。但是有一個「componentContext」,它包含我需要的ServletContext如此糟糕。但我沒有看到有可能訪問它。


下面是一些相關信息約我的配置

  1. 的web.xml

    <display-name>MyRestServer</display-name> 
    <servlet> 
        <servlet-name>MyServer</servlet-name> 
        <servlet-class>org.restlet.ext.servlet</servlet-class> 
        <init-param> 
         <param-name>org.restlet.component</param-name> 
         <param-value>com.example.my.server.MyMainComponent</param-value> 
        </init-param> 
    
        <load-on-startup>1</load-on-startup> 
    </servlet> 
    <context-param> 
        <param-name>myParam</param-name> 
        <param-value>the value</param-value> 
    </context-param> 
    <servlet-mapping> 
        <servlet-name>MyServer</servlet-name> 
        <url-pattern>/rs/*</url-pattern> 
    </servlet-mapping> 
    
  2. 的pom.xml

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
        <modelVersion>4.0.0</modelVersion> 
        <groupId>MyRestServer</groupId> 
        <artifactId>MyRestServer</artifactId> 
        <version>0.0.1-SNAPSHOT</version> 
        <packaging>war</packaging> 
        <name>YaynoRestServer</name> 
        <description>Maven POM von MyRestServer</description> 
        <build> 
         <sourceDirectory>src</sourceDirectory> 
         <plugins> 
          <plugin> 
           <artifactId>maven-compiler-plugin</artifactId> 
           <version>3.1</version> 
           <configuration> 
            <source>1.8</source> 
            <target>1.8</target> 
           </configuration> 
          </plugin> 
          <plugin>   
           <artifactId>maven-war-plugin</artifactId> 
           <version>2.4</version> 
           <configuration> 
            <warSourceDirectory>WebContent</warSourceDirectory> 
            <failOnMissingWebXml>false</failOnMissingWebXml> 
           </configuration> 
          </plugin> 
         </plugins> 
        </build> 
    
        <repositories> 
         <repository> 
          <id>maven-restlet</id> 
          <name>Public online Restlet repository</name> 
          <url>http://maven.restlet.com</url> 
         </repository> 
        </repositories> 
    
        <dependencies> 
         <dependency> 
          <groupId>org.restlet.jee</groupId> 
          <artifactId>org.restlet</artifactId> 
          <version>2.3.1</version> 
         </dependency> 
    
         <dependency> 
          <groupId>org.restlet.jee</groupId> 
          <artifactId>org.restlet.ext.servlet</artifactId> 
          <version>2.3.1</version> 
         </dependency> 
    
         <dependency> 
          <groupId>log4j</groupId> 
          <artifactId>log4j</artifactId> 
          <version>1.2.17</version> 
         </dependency> 
    
         <dependency> 
          <groupId>org.restlet.jse</groupId> 
          <artifactId>org.restlet.ext.json</artifactId> 
          <version>2.3.1</version> 
         </dependency> 
    
         <dependency> 
          <groupId>org.restlet.jee</groupId> 
          <artifactId>org.restlet.ext.jackson</artifactId> 
          <version>2.3.1</version> 
         </dependency> 
    
          <dependency> 
           <groupId>org.codehaus.jackson</groupId> 
           <artifactId>jackson-mapper-asl</artifactId> 
          <version>1.9.13</version> 
         </dependency> 
    
         <dependency> 
          <groupId>com.google.inject</groupId> 
          <artifactId>guice</artifactId> 
          <version>3.0</version> 
         </dependency> 
    
    
        </dependencies> 
    </project> 
    
  3. 來源

的結構,使基本MyMainComponent創建了MyMainApplication

public class MyMainComponent extends Component { 
     public YaynoMainComponent() { 
      // Starting Application 
      getDefaultHost().attachDefault(new MyMainApplication(questionManager.getQuestionPool(), userManager.getUserpool())); 
     } 
    } 

    public class MyMainApplication extends Application { 
     @Override 
     public Restlet createInboundRoot() { 

     // attach routes 
     Router router = new Router(getContext()); 
     //router attachments... 

     ComponentServerDispatcher c = (ComponentServerDispatcher) this.getContext().getServerDispatcher(); 

     return router; //breakpoint here to read out c-variable in debugger 
    } 

回答

1

默認主機,我認爲你應該使用的Restlet的客戶端協議war。它會自動註冊在Servlet容器中嵌入的Restlet應用程序的上下文中。要使用它,只需嘗試類似的東西:

ClientResource cr = new ClientResource(
     "war:///WEB-INF/textFileToRead.txt"); 
Representation fileContent = cr.get(); 
FileRepresentation fileRepresentation 
     = new FileRepresentation(fileContent); 

// Get stream on the file 
FileInputStream fis = fileRepresentation.getStream(); 
// Get file content as text 
String fileContentAsText = fileRepresentation.getText(); 

希望它可以幫助你, 蒂埃裏

+0

感謝您的回答。 不幸的是,它不工作,作爲變量: 表示fileContent = cr.get()也是「null」。 我嘗試了幾個傳遞給ClientResource的構造函數的URL,也沒有工作。 有沒有不同的方式來讀取本地文件到tomcat servlet中? – keltomat

1

謝謝蒂埃裏TEMPLIER,你的回答讓我和現在的工作。

是wasnt的的Restlet文檔中明確,尤其是此頁上的一點:

http://restlet.com/technical-resources/restlet-framework/javadocs/2.0/jee/ext/org/restlet/ext/servlet/ServerServlet.html

是戰爭的協議不工作正常,當你定義爲INIT-PARAM的org.restlet.component在你的web.xml中!相反,你必須使用org.restlet.application !!!

我在幾個乾淨的項目中試過了,結果總是相同的 - 當你使用組件作爲入口點時,訪問上下文會遇到麻煩。

非常感謝的人!

+0

高興聽到!非常感謝分析!這絕對是一種奇怪的行爲。我爲此打開了一個問題:https://github.com/restlet/restlet-framework-java/issues/1059。 –