Restlet Servlet 上下文始终为空

Restlet Servlet Context Always Null

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

我在 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 jee 并且一些示例是为 Restlet 1.0 jee 制作的。

以下是我尝试访问上下文的方式:

Context c = this.getContext();

我调试了它并从上面制作了变量 "c" 的屏幕截图:

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

如您所见,"context" "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
    }

我认为你应该使用 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();

希望对你有帮助, 蒂埃里

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

在 restlet 文档中,尤其是在这个页面上没有明确的要点:

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

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

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

好的谢谢大佬!