wjl
wjl

Reputation: 7351

Running Jersey with built in HTTP server

I'm trying to run a simple Jersey app from the command line using the built in HTTP server.

Following various tutorials, I've set my app up like this:

src/main/java/net/wjlafrance/jerseyfun/App.java:

package net.wjlafrance.jerseyfun;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.Response;

import java.io.IOException;

import com.sun.jersey.api.container.httpserver.HttpServerFactory;

/**
 * Hello world!
 *
 */
@Path("/hello")
public class App {

    public static void main(String[] args) {
        System.out.println("Starting HTTP server..");
        try {
            HttpServerFactory.create("http://localhost:9998/").start();
        } catch (IOException ex) {
            System.err.println(ex);
        }
    }

    @GET
    public Response getMessage() {
        String output = "It works!";
        return Response.status(200).entity(output).build();
    }

}

src/main/webapp/WEB-INF/web.xml:

<web-app id="WebApp_ID" version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>Restful Web Application</display-name>

    <servlet>
        <servlet-name>jersey-serlvet</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <init-param>
             <param-name>com.sun.jersey.config.property.packages</param-name>
             <param-value>net.wjlafrance.jerseyfun</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>jersey-serlvet</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

</web-app>

When I run mvn clean package exec:java -Dexec.mainClass=net.wjlafrance.jerseyfun.App, I see this output:

Starting HTTP server..
Apr 29, 2013 9:12:11 AM com.sun.jersey.api.core.ClasspathResourceConfig init
INFO: Scanning for root resource and provider classes in the paths:
  C:\cygwin\home\wlafrance\bin\apache-maven-3.0.5/boot/plexus-classworlds-2.4.jar
Apr 29, 2013 9:12:11 AM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
INFO: Initiating Jersey application, version 'Jersey: 1.17 01/17/2013 03:31 PM'
Apr 29, 2013 9:12:11 AM com.sun.jersey.server.impl.application.RootResourceUriRules <init>
SEVERE: The ResourceConfig instance does not contain any root resource classes.
[WARNING]
java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:297)
        at java.lang.Thread.run(Thread.java:662)
Caused by: com.sun.jersey.api.container.ContainerException: The ResourceConfig instance does not contain any root resource classes.
        at com.sun.jersey.server.impl.application.RootResourceUriRules.<init>(RootResourceUriRules.java:99)
        at com.sun.jersey.server.impl.application.WebApplicationImpl._initiate(WebApplicationImpl.java:1331)
        at com.sun.jersey.server.impl.application.WebApplicationImpl.access$700(WebApplicationImpl.java:168)
        at com.sun.jersey.server.impl.application.WebApplicationImpl$13.f(WebApplicationImpl.java:774)
        at com.sun.jersey.server.impl.application.WebApplicationImpl$13.f(WebApplicationImpl.java:770)
        at com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:193)
        at com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:770)
        at com.sun.jersey.api.container.ContainerFactory.createContainer(ContainerFactory.java:172)
        at com.sun.jersey.api.container.ContainerFactory.createContainer(ContainerFactory.java:264)
        at com.sun.jersey.api.container.ContainerFactory.createContainer(ContainerFactory.java:246)
        at com.sun.jersey.api.container.httpserver.HttpServerFactory.create(HttpServerFactory.java:117)
        at com.sun.jersey.api.container.httpserver.HttpServerFactory.create(HttpServerFactory.java:92)
        at net.wjlafrance.jerseyfun.App.main(App.java:22)
        ... 6 more

Clearly enough, my server is misconfigured. Can someone point me in the right direction?

Upvotes: 3

Views: 5030

Answers (3)

koppor
koppor

Reputation: 20531

With Jersey 1.x, the answer of @pakOverflow points to the right direction. Here the complete code with which I had success. Without any dependency on Grizlly1 or Grizzly2 etc.

import java.io.IOException;
import java.util.HashSet;
import java.util.Set;

import javax.ws.rs.core.Application;

import com.sun.jersey.api.container.httpserver.HttpServerFactory;
import com.sun.jersey.api.core.DefaultResourceConfig;
import com.sun.jersey.api.core.ResourceConfig;

public class WineryUsingHttpServer {

    public static void main(String[] args) throws IOException {
        ResourceConfig packagesResourceConfig = new DefaultResourceConfig();
        Application app = new Application() {
            @Override
            public Set<Class<?>> getClasses() {
                Set<Class<?>> res = new HashSet<>();
                res.add(org.example.MainResource.class);
                return res;
            }
        };
        packagesResourceConfig.add(app);

        HttpServerFactory.create("http://localhost:8080/", packagesResourceConfig).start();
    }

}

Upvotes: 1

pakkk
pakkk

Reputation: 289

You should do the following:

final com.sun.jersey.api.core.ResourceConfig packagesResourceConfig = new com.sun.jersey.api.core.ResourceConfig("net.wjlafrance.jerseyfun") ;

HttpServerFactory.create("http://localhost:9998/", packagesResourceConfig).start();

Upvotes: 0

Spark8006
Spark8006

Reputation: 685

See this line "The ResourceConfig instance does not contain any root resource classes" in the error message? You did not set any resource for the http server. What I will do is use this method:

GrizzlyHttpServerFactory.createHttpServer("http://localhost:9998/", new Application());

The new Application() will create a new ResourceConfig class for the http server. You should check the jersey's documents for that, it`s just a simple class which contains a java package. My ResourceConfig is likes below: import org.glassfish.jersey.server.ResourceConfig;

public class Application extends ResourceConfig {
  public Application() {
    packages("ftp.recourse");
  }
}

While the ftp.recourse package contains all the path and operations like GET, PUT, POST. Check the jersey`s official documents for more detials. Hope this will help

Upvotes: 0

Related Questions