Встроенный причал с Джерси или отдых
Я хочу сделать услуги RESTful, используя встроенный причал с JAX-RS (либо resteasy, либо трикотаж).
Я пытаюсь создать с настройкой 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();
}
}
даже это не работает.
может ли кто-нибудь предложить мне что-то/учебник/пример?
Ответы
Ответ 1
huh, связанная страница древняя - последнее обновление 3 года назад.
Вам действительно нужен причал? Джерси имеет отличную тщательно протестированную интеграцию с Grizzly (см. http://grizzly.java.net), которая также действует как транспортный слой Glassfish, и его можно использовать как в вашем примере.
См. образец helloworld из рабочего пространства Jersey, com.sun.jersey.samples.helloworld. Основной класс запускает Grizzly и "развертывает" приложение helloworld: http://repo1.maven.org/maven2/com/sun/jersey/samples/helloworld/1.9.1/helloworld-1.9.1-project.zip.
Если вам действительно нужен образец на причале, я предполагаю, что смогу его предоставить (не стесняйтесь обращаться ко мне).
EDIT:
ok, если вы действительно хотите причала, вы можете получить его:) и выглядит довольно просто. Я выполнил инструкции 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. Надеюсь, это поможет!
Дополнительную информацию о настройке Джерси в среде сервлета можно найти в руководстве пользователя, см. http://jersey.java.net/nonav/documentation/latest/
EDIT:
зависимостей.. но это довольно сложно определить, недавно он изменился в майке.. так что..
pre 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 repo для причала:
<repositories>
<repository>
<id>codehaus-release-repo</id>
<name>Codehaus Release Repo</name>
<url>http://repository.codehaus.org</url>
</repository>
</repositories>
Ответ 2
Здесь репозиторий github с образцом HelloWorld на основе Maven, настроенным для Grizzly на главной ветке и для Jetty на ветке "причал":
https://github.com/jesperfj/jax-rs-heroku
Несмотря на название репо, он не специфичен для Heroku. Запустите сервер, запустив команду, указанную в Procfile, например.
$ java -cp "target/dependency/*":target/classes Main
Ответ 3
Встраиваемая пристань с резайзой без 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>
Ответ 4
Мне удалось получить этот архетип maven за полчаса.
См. https://github.com/cb372/jersey-jetty-guice-archetype
Действия:
git clone https://github.com/cb372/jersey-jetty-guice-archetype.git
mvn install
mvn archetype:generate -DarchetypeGroupId=org.birchall \
-DarchetypeArtifactId=jersey-jetty-guice-archetype -DarchetypeVersion=1.0
mvn compile exec:java -Dexec.mainClass=com.yourpackage.Main
Огромное спасибо cb372 за создание этого архетипа. Это делает его очень легким.