Инициализация запуска RESTlet устарела?

Я пытаюсь использовать библиотеку restlet.org для создания веб-интерфейса RESTful, и я заметил, что, в отличие от его аналога сервлета, он не имеет дополнения к GenericServlet.init().

Если не считать создания еще одного сервлета для выполнения моей логики запуска, есть ли какой-либо встроенный способ избежать создания моих фабрик баз данных и т.п. по первому запросу (и всей соразмерной блокировки, которую мне придется сделать, чтобы избежать множественных инициализаций)?


person Chris K    schedule 10.06.2010    source источник


Ответы (2)


Вы хотите запустить его в контейнере сервлетов? Если нет, в документации показано, как запустить его автономно:

public static void main(String[] args) throws Exception {  
    // Create a new Component.  
    Component component = new Component();  

    // Add a new HTTP server listening on port 8182.  
    component.getServers().add(Protocol.HTTP, 8182);  

    // Attach the sample application.  
    component.getDefaultHost().attach("/firstSteps",  
            new FirstStepsApplication());  

    // Start the component.  
    component.start();
}  

Вы, конечно, могли бы сделать инициализацию там.

Если вы хотите использовать подход сервлетов, попробуйте написать новый сервлет и расширить их. Реализуйте свой метод инициализации и вызовите его для суперкласса.

person Brad Gardner    schedule 10.06.2010
comment
Да, я хочу запустить это из Tomcat или Jboss или откуда-то еще. Похоже, что я мог бы создать подкласс org.restlet.ext.servlet.ServerServlet и реализовать ServerServlet.init()... ИМХО это может немного раздражать. :-/ - person Chris K; 10.06.2010

Если вы действительно хотите сделать это в среде сервлетов, у вас потенциально может быть два сервлета в вашем веб-приложении: один для приложения/компонента Restlet и один для вашей инициализации, используя load-on-startup (который вы не обязательно сопоставляете с каким-либо URL-адресом, поскольку насколько я знаю, вам это не нужно). Таким образом, вам не придется создавать подкласс org.restlet.ext.servlet.ServerServlet. Я думаю, что это, вероятно, проще, так как этот сервлет инициализации будет просто содержать init(), но это будет работать только для вещей, которые не зависят от приложения/компонента Restlet, которые должны быть инициализированы в первую очередь.

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

<servlet>
    <servlet-name>ExampleInit</servlet-name>
    <servlet-class>example.TestInitServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet>
    <servlet-name>Example</servlet-name>
    <servlet-class>org.restlet.ext.servlet.ServerServlet</servlet-class>
    <init-param>
        <param-name>org.restlet.application</param-name>
        <param-value>example.TestApplication</param-value>
    </init-param>
    <init-param>
        <param-name>org.restlet.autoWire</param-name>
        <param-value>true</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>Example</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

В качестве альтернативы (или, возможно, в дополнение к этому) я обычно использую JNDI для инициализации соединений с базой данных и некоторых других параметров конфигурации. Это также позволяет мне сохранять ту же конфигурацию и механизмы загрузки, независимо от того, использую ли я автономный сервер Restlet или Restlet в веб-приложении.

Например, для развертывания в контейнере сервлета (например, Jetty или Tomcat) я использую конфигурацию JNDI контейнера, но для локальных тестов (с автономным приложением Restlet) я использую фабрику контекста Jetty JNDI (которую вы можете получить как отдельный баночка от остальной пристани).

person Bruno    schedule 24.06.2010