Jersey en Jetty en Android lanza ContainerException: la instancia ResourceConfig no contiene ninguna clase de recurso raíz

Estoy tratando de ejecutar Jersey en Jetty en Android.

He creado un Android que crea una instancia de un servidor Jetty con un Servlet de Jersey. De todos modos cuando comienzo Jetty y visito un recurso REST (en mi caso:<a href="http://192.168.1.12:8080/api/hello" rel="nofollow noreferrer">http://192.168.1.12:8080/api/hello</a>) Recibo una excepción de contenedor con el mensaje: la instancia de ResourceConfig no contiene ninguna clase de recursos de raíz. (Ver el seguimiento de la pila de excepciones a continuación).

¿Alguna idea de por qué?

MÁS DETALLES:

Logcat está dando las siguientes ALGUNAS ADVERTENCIAS.

The following errors and warnings have been detected with resource and/or provider classes:

SEVERE: Missing dependency for field: private java.lang.ThreadLocal com.sun.jersey.server.impl.container.servlet.JSPTemplateProcessor.requestInvoker SEVERE: Missing dependency for field: private java.lang.ThreadLocal com.sun.jersey.server.impl.container.servlet.JSPTemplateProcessor.requestInvoker

Esto es extraño porque java.lang.ThreadLocal está disponible paraAndroide y HttpServletRequest y HttpServletResponse deberían estar disponibles desde que he incluido servlet-api-2.5.jar en la carpeta libs.

Jersey depende de algunas bibliotecas javax (jaxb-api-2.2.2.jar, jndi-1.2.1.jar, stax-api-1.0-2.jar) que tuve que agregar al proyecto y configurar el --core- parámetro de biblioteca temporal para ignorar la advertencia de dex sobre paquetes javax como dependencias.

También eliminé las siguientes clases (RenderedImageProvider, DataSourceProvider, MimeMultipartProvider del paquete com.sun.jersey.core.impl.provider.entity del jersey core jar) para evitar dependencias de java.awt y javax.mail.

EXCEPCIÓN traza:

javax.servlet.UnavailableException: com.sun.jersey.api.container.ContainerException: The ResourceConfig instance does not contain any root resource classes.
at org.eclipse.jetty.servlet.ServletHolder.makeUnavailable(ServletHolder.java:409)
at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:450)
at org.eclipse.jetty.servlet.ServletHolder.getServlet(ServletHolder.java:331)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:476)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:517)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:935)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:404)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:184)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:870)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
at org.eclipse.jetty.server.Server.handle(Server.java:346)
at org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:596)
at org.eclipse.jetty.server.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:1051)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:592)
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:214)
at org.eclipse.jetty.server.HttpConnection.handle(HttpConnection.java:426)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:520)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:40)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:528)
at java.lang.Thread.run(Thread.java:1019)

Iniciar la actividad de Android del servidor:

public class StartServerActivity extends Activity {

private Server webServer;

private final static String LOG_TAG = "Jetty";


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    System.setProperty("java.net.preferIPv4Stack", "true");
    System.setProperty("java.net.preferIPv6Addresses", "false");

    webServer = new Server(8080);

    ServletHolder servletHolder = new ServletHolder(com.sun.jersey.spi.container.servlet.ServletContainer.class);
    servletHolder.setInitParameter("com.sun.jersey.config.property.packages", "com.famenu.server.resources");

    ServletContextHandler servletContextHandler = new ServletContextHandler(webServer, "/api", true, false);
    servletContextHandler.addServlet(servletHolder, "/hello");

    webServer.setHandler(servletContextHandler);


    try {
        webServer.start();
        Log.d(LOG_TAG, "started Web server");

    }
    catch (Exception e) {
        Log.d(LOG_TAG, "unexpected exception starting Web server: " + e);
    }

}

}

Recurso de Jersey:

package com.famenu.server.resources;

import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces;

@Path ("/") clase pública HelloResource {

@GET
@Produces("text/plain")
public String getMsg() {

    return "Hello Resource";

}

}

Estoy usando Jetty 7.3.0.v20110203, Jersey 1.12, Android 1.6 Llegué hasta este punto después de otra excepción explicadaaquí

Respuestas a la pregunta(1)

Su respuesta a la pregunta