Restlet web.xml配置新组件

时间:2014-10-01 14:55:06

标签: java google-app-engine restlet

我已经建立了一个App Engine Restlet项目(v 2.2.2),它为不同的用户返回一个html或json响应(web或android客户端)和db的不同数据。我已经实现了HTTP基本身份验证。一切都运作良好。

我的基本设置atm(我简化了它):

MyApplication.java

public class MyApplication extends Application {

    private ChallengeAuthenticator authenticatior;
    private ChallengeAuthenticator createAuthenticator() {...}
    public boolean authenticate(Request request, Response response) {...}

    @Override
    public Restlet createInboundRoot() {
        this.authenticatior = createAuthenticator();        
        Router router = new Router(getContext());
        router.attachDefault(MyRestlet.class);
        authenticatior.setNext(router);
        return authenticatior;
    }

MyRestlet.java

public class MyRestlet extends ServerResource {

        @Get("json")
        public Representation getJSON() {
            MyApplication app = (MyApplication) getApplication();
                if (!app.authenticate(getRequest(), getResponse())) {
                    // Not authenticated
                    return null;
                }
                else {
                    return data;     
                }

        @Get("html")
        public String getHTML() {...}
}

的web.xml

<?xml ...>
<display-name>MyName</display-name>  

<context-param>
<param-name>org.restlet.application</param-name>
<param-value>x.MyApplication</param-value>
</context-param>

<servlet>
<servlet-name>MyRestlet</servlet-name>
<servlet-class>org.restlet.ext.servlet.ServerServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>MyRestlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>

现在我想添加加密并创建密钥/证书。我的导游是tutorial。我想首先尝试添加一个简单的组件,保持HTTP并将端口更改为8183,如此tutorial中所做的那样。我现在玩了很多,似乎无法使我的组件工作。所以我的问题是:我将把这个main方法放在哪里(以下代码来自教程)?我应该在哪个类中插入它,或者我应该创建一个单独的服务器类,以及对web.xml所需的更改究竟是什么样的(我没有发现很多关于这一点,我怀疑这是核心问题)?任何帮助表示赞赏!

public static void main(String[] args) throws Exception {
    // Create a new Restlet component and add a HTTP server connector to it
    Component component = new Component();
    component.getServers().add(Protocol.HTTP, 8182);

    // Then attach it to the local host
    component.getDefaultHost().attach("/trace", Part05.class);

    // Now, let's start the component!
    // Note that the HTTP server connector is also automatically started.
    component.start();
}

2 个答案:

答案 0 :(得分:1)

你的问题有点令人困惑,可能是因为你走的路。

您的原始计划创建了一个RESTlet Web应用程序,其中包含web.xml以在容器内运行,例如GAE,Jetty或Tomcat。

您提出的建议创建一个组件并启动独立服务器(它启动Jetty的内部实例)。这不会在Google App Engine上运行。

您应继续使用web.xml方法并将GAE配置为通过https提供服务。有关配置说明,请参阅https://cloud.google.com/appengine/kb/general#httpshttps://cloud.google.com/appengine/docs/java/config/webxml#Secure_URLs

另外,另一个提示:当某些东西试图未经授权访问资源时返回403状态。

答案 1 :(得分:0)

所以我试图将JavaSE RESTLET应用程序转换为JavaEE应用程序。我从&#34; Restlet in Action&#34;本书,第72页,我们不需要将服务器连接到组件,因为Servlet引擎处理传入的HTTP和HTTPS请求。

本教程还指出组件文件是web.xml中的INIT-PARAM或param-name。但对我来说,上述两项变更都没有奏效。

如果我将应用程序类指向为INIT-PARAM并且不使用书中建议的HTTP连接器,我可以访问API但无法从客户端类进行任何调用,因为我得到了以下内容错误 -

警告:此请求使用的协议未在客户端连接器列表中声明。 (HTTP / 1.1)。如果您正在使用Component类的实例,请检查其&#34;客户端&#34;属性。 未找到(404) - 服务器未找到与请求URI匹配的任何内容

希望这些信息以某种方式帮助您


修改

我找到了解决上述问题的方法 - 我不得不添加以下代码

        <init-param>
            <param-name>org.restlet.clients</param-name>
            <param-value>HTTP HTTPS FILE</param-value>
        </init-param>

同样针对您的问题,您需要通过XML配置组件。 URL下方将提供更多信息 -

http://restlet.com/learn/javadocs/2.1/jee/ext/org/restlet/ext/servlet/ServerServlet.html http://restlet.com/learn/javadocs/2.1/jee/api/org/restlet/Component.html?is-external=true