【问题标题】:JAX-RS Resource not found in GlassFish Server在 GlassFish Server 中找不到 JAX-RS 资源
【发布时间】:2015-01-24 18:57:22
【问题描述】:

我一直在尝试使用 NetBeans Ide 创建一个简单的 Restful WebService。
我的 Java EE 版本是:Java EE 7 Web。

我创建了一个新的 Java Web 应用程序,设置了这个 ContexPath:/DukesAgeService

现在,运行我的应用程序,浏览器显示我的Index.html 页面:

http://localhost:8080/DukesAgeService/

所以,一切正常。

然后,我尝试使用 RESTful Web 服务向导创建一个简单的 RESTful 资源。

所以,我创建了这个类:

package firstcup.webservice;

import javax.ws.rs.core.Context;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PUT;

/**
 * REST Web Service
*
* @author nolanof
*/
@Path("dukesAge")
public class DukesAgeResource {

@Context
private UriInfo context;

/**
 * Creates a new instance of DukesAgeResource
 */
public DukesAgeResource() {
}

/**
 * Retrieves representation of an instance of firstcup.webservice.DukesAgeResource
 * @return an instance of java.lang.String
 */
@GET
@Produces("text/plain")
public String getText() {        
    return "hello world";
}
}

但是在 url 处运行我的应用程序: http://localhost:8080/DukesAgeService/dukesAge 我得到一个 404-not found 页面。

我预计任何传入的具有"/dukesAge" url 的get 请求都由DukesAgeResourcegetText 方法处理。怎么了?

谢谢

【问题讨论】:

  • 请将您的 web.xml 文件连同项目文件夹结构一起发布

标签: java web-services rest glassfish jax-rs


【解决方案1】:

您可能缺少 JAX-RS 应用程序 servlet。您可以在web.xml 中定义它,或者如果您想减少xml,您可以使用Application 子类。 IMO 最简单的方法就是使用带有@ApplicationPath 注释的Application 子类。将创建一个 servlet,并将 servlet 路径设置为注释中的值。类似的东西

@ApplicationPath("/rest")
public class RestApplication extends Application {
    // All request scoped resources and providers
    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> classes = new HashSet<>();
        classes.add(DukesAgeResource.class);
        return classes;
    }

    // all singleton resources and providers
    @Override
    public Set<Object> getSingletons() {
        Set<Object> singletons = new HashSet<>();
        return singletons;
    }
}

那么资源应该是通过

http://localhost:8080/DukesAgeService/rest/dukesAge.

还有其他方法,但这是可移植的方法。 Glassfish 使用 Jersey,但在 Netbeans 中从头开始创建 Java EE Web 应用程序只会导入编译时 Java EE 标准类(没有 Jersey 依赖项)。因此,以上内容确实是您开始时最好的选择。

您可以在Jersey Documentation 上查看其他部署选项。对于某些选项,您可能需要添加一些 Jersey 编译时依赖项。这就是我刚才提到的原因。不需要其他罐子。

导致 404 的另一件事是,如果您将 JAX-RS servlet 路径指定为 /*。这将与提供静态资源(如 html 页面)的默认 servlet 冲突。这就是为什么我将它设置为/rest


更新

JAX-RS 规范中还规定,如果在 getClasses()getSingletons() 中返回空集,则应进行隐式类路径扫描。 (提供者)带有@Provider 注释的类将默认添加为单例,而带有@Path 注释的资源类将是每个请求的对象(意味着每个请求都会创建一个新对象)。所以你也可以有

@ApplicationPath("/rest")
public class RestApplication extends Application {
    // Left empty
}

它应该同样工作。

【讨论】:

    【解决方案2】:

    您可能在 web.xml 中初始化了一些路径,这可能就是您在调用服务时收到 404 错误的原因。请检查您的 web.xml,如果它设置为任何内容,而不是 *,那么请将其附加到您的服务调用以使其正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多