2015-04-21 3 views
1

Я действительно расстроен, потому что с трех дней я не делал никакого прогресса в этой проблеме.Restlet Servlet Context Always Null

У меня есть сервлет сервлета, встроенный в сервер 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(); 

Я отлажена его и сделал Screenshop переменной "с" сверху:

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

Как вам может видеть «контекст». Переменная «ServerDispatcher» имеет значение null. Но есть «componentContext», который содержит ServletContext, который мне так нужен. Но я не вижу возможности получить к нему доступ.


Вот некоторые Infos о моей конфигурации

  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

Я думаю, что вы должны использовать протокол клиента war из Restlet. Он автоматически регистрируется в контексте приложения 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». Я пробовал несколько URL-адресов, передаваемых в cosntructor ClientResource, также не работал. Есть ли другой способ прочитать локальный файл в сервлете tomcat? – keltomat

1

Спасибо вам Thierry TEMPLIER, ваш ответ мне помог, и он работает в настоящее время.

Точка, что не было ясно, в Restlet документации, особенно на этой странице:

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

является то, что война-протокол не работает должным образом, когда вы определяете, как INIT-парам org.restlet.component в вашем web.xml! Вместо этого вы должны использовать org.restlet.application !!!

Я пробовал его в нескольких проектах, и результат всегда был таким же - когда вы используете компонент в качестве точки входа, возникнут проблемы с доступом к контексту.

Ну, спасибо, человек!

+0

Рад это слышать! Большое спасибо за анализ! Это совершенно странное поведение. Я открыл для этого проблему: https://github.com/restlet/restlet-framework-java/issues/1059. –