3

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

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

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>

当我运行时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

很明显,我的服务器配置错误。有人可以指出我正确的方向吗?

4

3 回答 3

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

}
于 2017-03-23T21:33:19.753 回答
0

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

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

new 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。查看球衣的官方文件了解更多细节。希望这会有所帮助

于 2013-10-18T00:28:26.340 回答
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();
于 2016-06-30T09:34:13.187 回答