使用内置HTTP服务器运行Jersey

时间:2013-04-29 14:13:41

标签: java jersey

我正在尝试使用内置的HTTP服务器从命令行运行一个简单的Jersey应用程序。

按照各种教程,我将我的应用程序设置为:

的src /主/爪哇/净/ 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 /主/ web应用/ 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>

当我运行mvn clean package exec:java -Dexec.mainClass=net.wjlafrance.jerseyfun.App时,我看到了这个输出:

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

显然,我的服务器配置错误。有人能指出我正确的方向吗?

3 个答案:

答案 0 :(得分:1)

使用Jersey 1.x,@ pakOverflow的答案指向了正确的方向。这里是我成功的完整代码。不依赖于Grizlly1或Grizzly2等。

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();
    }

}

答案 1 :(得分:0)

在错误消息中看到此行“ResourceConfig实例不包含任何根资源类”? 您没有为http服务器设置任何资源。 我要做的是使用这种方法:

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

新的Application()将为http服务器创建一个新的ResourceConfig类。你应该检查一下球衣的文件,它只是一个包含java包的简单类。 我的ResourceConfig如下所示:     import org.glassfish.jersey.server.ResourceConfig;

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

虽然ftp.recourse包中包含所有路径和操作,如GET,PUT,POST。 查看球衣官方文件了解更多详情。希望这会有所帮助

答案 2 :(得分:0)

您应该执行以下操作:

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();