Restlet Servlet Context始终为空

时间:2015-04-21 09:48:53

标签: tomcat servlets restlet context.xml

我真的很沮丧,因为三天后我没有在这个问题上取得任何进展。

我在Tomcat v7.0服务器中嵌入了Restlet Servlet。除了访问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&#34; c&#34;从上面:

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

正如您所看到的那样&#34; context&#34;变量&#34; ServerDispatcher&#34;一片空白。但是有一个&#34; componentContext&#34;,它包含我需要的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. 来源结构

  4. 所以基本上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
        }
    

2 个答案:

答案 0 :(得分: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();

希望它可以帮到你, 亨利

答案 1 :(得分:1)

谢谢thierry templier,你的回答对我有帮助,现在就可以了。

restlet文档中没有明确的要点,特别是在此页面上:

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

当你在web.xml中定义为init-param和org.restlet.component时,war-protocol无法正常工作!相反,你必须使用org.restlet.application !!!

我在几个干净的项目中尝试过,结果总是一样的 - 当你使用组件作为入口点时,访问上下文会有问题。

非常感谢你!