我真的很沮丧,因为三天后我没有在这个问题上取得任何进展。
我在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。但是我没有看到访问它的可能性。
以下是有关我的配置的一些信息
的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>
的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>
来源结构
所以基本上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
}
答案 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文档中没有明确的要点,特别是在此页面上:
当你在web.xml中定义为init-param和org.restlet.component时,war-protocol无法正常工作!相反,你必须使用org.restlet.application !!!
我在几个干净的项目中尝试过,结果总是一样的 - 当你使用组件作为入口点时,访问上下文会有问题。
非常感谢你!