Встроенный причал с джерси или рестайлингом

Я хочу создавать службы RESTful, используя встроенную причалку с JAX-RS (либо resteasy, либо jersey). Я пытаюсь создать с помощью настройки maven / eclipse. если я попытаюсь следовать http://wikis.sun.com/pages/viewpage.action?pageId=21725365 ссылка Я не могу устранить ошибку ServletHolder sh = new ServletHolder(ServletContainer.class);

public class Main {

    @Path("/")
    public static class TestResource {

        @GET
        public String get() {
            return "GET";
        }
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws Exception {
        ServletHolder sh = new ServletHolder(ServletContainer.class);

        /*
         * For 0.8 and later the "com.sun.ws.rest" namespace has been renamed to
         * "com.sun.jersey". For 0.7 or early use the commented out code instead
         */
        // sh.setInitParameter("com.sun.ws.rest.config.property.resourceConfigClass",
        // "com.sun.ws.rest.api.core.PackagesResourceConfig");
        // sh.setInitParameter("com.sun.ws.rest.config.property.packages",
        // "jetty");
        sh.setInitParameter("com.sun.jersey.config.property.resourceConfigClass",
            "com.sun.jersey.api.core.PackagesResourceConfig");
        sh.setInitParameter("com.sun.jersey.config.property.packages",
            "edu.mit.senseable.livesingapore.platform.restws");
        // sh.setInitParameter("com.sun.jersey.config.property.packages",
        // "jetty");
        Server server = new Server(9999);

        ServletContextHandler context = new ServletContextHandler(server, "/",
            ServletContextHandler.SESSIONS);
        context.addServlet(sh, "/*");
        server.start();
        server.join();
        // Client c = Client.create();
        // WebResource r = c.resource("http://localhost:9999/");
        // System.out.println(r.get(String.class));
        //
        // server.stop();
    }
}

даже это не работает. может кто-нибудь предложить мне что-нибудь / учебник / пример?


person rinku    schedule 14.09.2011    source источник


Ответы (4)


да, связанная страница старая - последнее обновление 3 года назад.

Вам действительно нужна пристань? В Джерси отлично протестирована интеграция с Grizzly (см. http://grizzly.java.net), который также действует как транспортный уровень Glassfish и можно использовать как в вашем примере.

См. Образец helloworld из рабочей области Джерси, класс com.sun.jersey.samples.helloworld.Main запускает Grizzly и "развертывает" приложение helloworld: http://repo1.maven.org/maven2/com/sun/jersey/samples/helloworld/1.9.1/helloworld-1.9.1-project.zip.

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

РЕДАКТИРОВАТЬ:

хорошо, если вам действительно нужна пристань, вы можете ее получить :) и выглядит довольно просто. Я выполнил инструкции http://docs.codehaus.org/display/JETTY/Embedding+Jetty и удалось запустить образец helloworld:

public static void main(String[] args) throws Exception {
    Server server = new Server(8080);
    Context root = new Context(server,"/",Context.SESSIONS);
    root.addServlet(new ServletHolder(new ServletContainer(new PackagesResourceConfig("com.sun.jersey.samples.helloworld"))), "/");
    server.start();
}

Доступен http://localhost:8080/helloworld. Я использовал Jetty 6.1.16. Надеюсь, поможет!

Дополнительную информацию о настройке Jersey в среде сервлетов можно найти в руководстве пользователя, см. http://jersey.java.net/nonav/documentation/latest/

РЕДАКТИРОВАТЬ:

зависимости ... но это довольно сложно указать, это недавно изменилось в майке ... так что ..

до 1.10:

<dependency>
    <groupId>org.mortbay.jetty</groupId>
    <artifactId>jetty</artifactId>
    <version>6.1.16</version>
</dependency>
<dependency>
     <groupId>com.sun.jersey</groupId>
     <artifactId>jersey-server</artifactId>
     <version>${jersey.version}</version>
</dependency>

сообщение 1.10:

<dependency>
    <groupId>org.mortbay.jetty</groupId>
    <artifactId>jetty</artifactId>
    <version>6.1.16</version>
</dependency>
<dependency>
     <groupId>com.sun.jersey</groupId>
     <artifactId>jersey-servlet</artifactId>
     <version>${jersey.version}</version>
</dependency>

и вам нужно это репо maven для причала:

<repositories>
    <repository>
        <id>codehaus-release-repo</id>
        <name>Codehaus Release Repo</name>
        <url>http://repository.codehaus.org</url>
    </repository>
</repositories>
person Pavel Bucek    schedule 14.09.2011
comment
да, на самом деле я искал пример на основе встроенного причала, вы можете мне рассказать об этом? - person rinku; 15.09.2011
comment
хорошо, ответ обновлен, я могу предоставить полный образец (проект maven), если требуется. - person Pavel Bucek; 15.09.2011
comment
Привет, это потрясающе, это именно то, что я хотел :) но я не могу разрешить все зависимости maven .. вы можете опубликовать все необходимые зависимости? Спасибо за помощь :) - person rinku; 17.09.2011
comment
Выполнено. Вам потребуются дополнительные зависимости для jersey-client и т. Д., Но вы легко сможете это понять. - person Pavel Bucek; 17.09.2011
comment
Привет, я получаю следующую ошибку: HTTP ERROR 503 Problem accessing /helloworld/. Reason: com.sun.jersey.api.container.ContainerException: The ResourceConfig instance does not contain any root resource classes. Caused by: javax.servlet.UnavailableException: com.sun.jersey.api.container.ContainerException: The ResourceConfig instance does not contain any root resource classes. - person rinku; 17.09.2011
comment
Я попробовал следующий код: `import org.mortbay.jetty.Server; import org.mortbay.jetty.servlet.Context; import org.mortbay.jetty.servlet.ServletHolder; import com.sun.jersey.api.core.PackagesResourceConfig; import com.sun.jersey.spi.container.servlet.ServletContainer; открытый класс OneServletContext {public static void main (String [] args) выдает исключение {Server server = new Server (8080); Корень контекста = новый контекст (сервер, /, Context.SESSIONS); root.addServlet (новый ServletHolder (новый ServletContainer (- server.start ();}} ` - person rinku; 17.09.2011
comment
Привет, я пробовал то же самое, но получил ошибку HTTP 503. извините, я новичок в этом, возможно ли вам поделиться полным примером проекта maven? - person rinku; 17.09.2011
comment
вам нужно изменить имя пакета в конструкторе PackagesResourceConfig, чтобы оно соответствовало имени вашего пакета ресурсов (он выполняет рекурсивное сканирование) - person Pavel Bucek; 17.09.2011
comment
Спасибо, наконец-то сработало :) .. могу ли я использовать любой класс ресурсов Java вместо helloworld? какие-то особые ограничения на синтаксис в этом? - person rinku; 17.09.2011
comment
Знаете ли вы, как я могу ввести любую ссылку на объект, а затем сослаться на нее в классе ресурсов позже .. Я разместил новый вопрос stackoverflow.com/questions/7510874/ вы можете что-нибудь предложить? - person rinku; 22.09.2011
comment
Привет, предложение, упомянутое в stackoverflow.com/questions/7510874/, похоже, не работает .. есть комментарии? - person rinku; 28.09.2011
comment
мы можем отключить его. Лучший способ решить эту проблему - поделиться каким-то общим образцом, я могу создать чистый проект maven или исправить ваше приложение, выбор за вами. - person Pavel Bucek; 30.09.2011
comment
Я подхожу к этой проблеме поздно, но я бы также сказал, что помните о разнице между лицензиями: grizzly - это cddl, а jetty - это apache. - person bityz; 02.05.2013

Вот репозиторий github с образцом HelloWorld на основе Maven, настроенным для Grizzly в главной ветке и для Jetty в ветке «причал»:

https://github.com/jesperfj/jax-rs-heroku

Несмотря на название репо, оно не специфично для Heroku. Запустите сервер, выполнив команду, указанную в Procfile, например

$ java -cp "target/dependency/*":target/classes Main
person Jesper J.    schedule 30.12.2011

Встроенный причал с reaseasy без web.xml

код Java:

    final QueuedThreadPool threadPool = new QueuedThreadPool();
    threadPool.setMinThreads(2); // 10
    threadPool.setMaxThreads(8); // 200
    threadPool.setDetailedDump(false);
    threadPool.setName(SERVER_THREAD_POOL);
    threadPool.setDaemon(true);

    final SelectChannelConnector connector = new SelectChannelConnector();
    connector.setHost(HOST);
    connector.setAcceptors(2);
    connector.setPort(PROXY_SEVLET_PORT);
    connector.setMaxIdleTime(MAX_IDLE_TIME);
    connector.setStatsOn(false);
    connector.setLowResourcesConnections(LOW_RESOURCES_CONNECTIONS);
    connector.setLowResourcesMaxIdleTime(LOW_RESOURCES_MAX_IDLE_TIME);
    connector.setName(HTTP_CONNECTOR_NAME);            

    /* Setup ServletContextHandler */
    final ServletContextHandler contextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);
    contextHandler.setContextPath("/");
    contextHandler.addEventListener(new ProxyContextListener());

    contextHandler.setInitParameter("resteasy.servlet.mapping.prefix","/services");

    final ServletHolder restEasyServletHolder = new ServletHolder(new HttpServletDispatcher());
    restEasyServletHolder.setInitOrder(1);

/* Scan package for web services*/
restEasyServletHolder.setInitParameter("javax.ws.rs.Application","com.viacom.pl.cprox.MessageApplication");

    contextHandler.addServlet(restEasyServletHolder, "/services/*");

    final HandlerList handlers = new HandlerList();
    handlers.setHandlers(new Handler[] { contextHandler });

    final Server server = new Server();
    server.setThreadPool(threadPool);
    server.setConnectors(new Connector[] { connector });
    server.setHandler(handlers);
    server.setStopAtShutdown(true);
    server.setSendServerVersion(true);
    server.setSendDateHeader(true);
    server.setGracefulShutdown(1000);
    server.setDumpAfterStart(false);
    server.setDumpBeforeStop(false);

    server.start();
    server.join();

Детектор веб-сервисов:

package com.viacom.pl.cprox;

import java.util.HashSet;
import java.util.Set;

import javax.ws.rs.core.Application;

import org.reflections.Reflections;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.viacom.pl.cprox.services.impl.AbstractWebServiceMethod;

public class MessageApplication extends Application {

    private static final Logger LOGGER = LoggerFactory.getLogger(MessageApplication.class);

    private Set<Object> singletons = new HashSet<Object>();

    @SuppressWarnings("rawtypes")
    public MessageApplication() {

        /* Setup RestEasy */
        Reflections reflections = new Reflections("com.viacom.pl.cprox.services.impl");

        /*All my web services methods wrapper class extends AbstractWebServiceMethod, so it is easy to get sub set of expected result.*/
        Set<Class<? extends AbstractWebServiceMethod>> set = reflections
                .getSubTypesOf(AbstractWebServiceMethod.class);
        for (Class<? extends AbstractWebServiceMethod> clazz : set) {
            try {
                singletons.add(clazz.newInstance());
            } catch (InstantiationException e) {
                LOGGER.error(e.getMessage(), e);
            } catch (IllegalAccessException e) {
                LOGGER.error(e.getMessage(), e);
            }
        }
    }

    @Override
    public Set<Object> getSingletons() {
        return singletons;
    }
}

pom.xml

<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-jaxb-provider</artifactId>
    <version>2.2.0.GA</version>
</dependency>
<dependency>
    <groupId>org.reflections</groupId>
    <artifactId>reflections</artifactId>
    <version>0.9.9-RC1</version>
</dependency>

<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-jaxrs</artifactId>
    <version>3.0.3.Final</version>
</dependency>
person Karol Król    schedule 03.02.2014