【问题标题】:Can't get Jersey mappings to work [closed]无法让泽西映射工作[关闭]
【发布时间】:2014-07-21 12:53:45
【问题描述】:

我对 Java 很陌生,我基本上是从 PHP 开始接触 Java。

我正在尝试在 Jersey 和 Tomcat 的帮助下启动并运行一个 RESTful API。但我似乎犯了一个错误,我找不到与我得到的错误消息相同的任何帖子或线程。我将非常感谢有关此问题的任何帮助,谢谢!

这是我的 Maven 依赖项

<dependencies>
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-grizzly2-http</artifactId>
        <version>2.9</version>
    </dependency>

    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-grizzly2-servlet</artifactId>
        <version>2.9</version>
    </dependency>

    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-jdk-http</artifactId>
        <version>2.9</version>
    </dependency>

    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-simple-http</artifactId>
        <version>2.9</version>
    </dependency>

    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-jetty-http</artifactId>
        <version>2.9</version>
    </dependency>

    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-jetty-servlet</artifactId>
        <version>2.9</version>
    </dependency>
</dependencies>

这是 web.xml

<servlet>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
</servlet>

<servlet-mapping>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

这是我的代码

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

@Path("/account")
public class AccountREST
{

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String info(){
        return "This is the RESTful API";
    }
    @GET
    @Path("/getit")
    @Produces(MediaType.TEXT_PLAIN)
    public String getIt(){
        System.out.println("Got it!");
        return "Got it!";
    }
}

当我进入 URL http://localhost:8080/rest/account/getit 时,我收到此错误消息,我无法破译

java.lang.NullPointerException
    org.apache.catalina.loader.WebappClassLoader.binaryNameToPath(WebappClassLoader.java:2496)
    org.apache.catalina.loader.WebappClassLoader.findLoadedClass0(WebappClassLoader.java:2702)
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1223)
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1175)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:491)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:74)
    org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:526)
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1017)
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:652)
    org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:277)
    org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2451)
    org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2440)
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    java.lang.Thread.run(Thread.java:745)

【问题讨论】:

  • 经过数小时的努力,我终于让它工作了。您发送的线程与我的问题间接相关。这是因为我没有正确实现 Jersey 的 API。所以这个问题是在外部库中触发的。我将向此线程发送一个答案,解释我所做的事情,以便其他人看到。
  • 很高兴听到它,希望这个解释对将来的人有所帮助。

标签: java rest maven tomcat jersey


【解决方案1】:

我最终让它工作了,我已经为此苦苦挣扎了好几个小时。您在上面发布的文章与我的问题有些相关,但在 Jersey API 中。我没有正确实施泽西岛。我发现所有的指南和教程只是部分解释了如何实现 Jersey RESTful API,这让我很困惑。

对于遇到与我相同的问题的任何人,这是我的新设置:

pom.xml

<dependencies>
    <!-- Servlet 3.0 API -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>
    <!-- JAX-RS RESTful Web Services -->
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet</artifactId>
        <version>2.9</version>
    </dependency>
</dependencies>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

</web-app>

RESTConfig.class

import javax.ws.rs.core.Application;
import javax.ws.rs.ApplicationPath;
import java.util.HashSet;
import java.util.Set;

@ApplicationPath("/rest")
public class RESTConfig extends Application
{

    public RESTConfig(){}

    @Override
    public Set<Class<?>> getClasses( )
    {
        final Set<Class<?>> returnValue = new HashSet<Class<?>>( );
        returnValue.add( Account.class );
        return returnValue;
    }
}

Account.class

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

@Path("/account")
public class Account
{

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String info(){
        return "This is the Account RESTful API";
    }

    @GET
    @Path("/getit")
    @Produces(MediaType.TEXT_PLAIN)
    public String getit(){
        System.out.println("Got it!");
        return "Got it!";
    }

}

【讨论】:

  • 谢谢!泽西岛的文档是 suxx。在向 HashMap 添加类的地方注意到 RestConfig 中有一个错字。它应该是 Account,而不是 AccountREST
  • @x4444 谢谢,我已经修改了它,很高兴它对你有所帮助!
猜你喜欢
  • 1970-01-01
  • 2012-07-17
  • 2014-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多