在 GlassFish Server 中找不到 JAX-RS 资源

JAX-RS Resource not found in GlassFish Server

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

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

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

http://localhost:8080/DukesAgeService/

所以,一切正常。

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

所以,我创建了这个 class:

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 请求都由 DukesAgeResource class getText 方法处理。怎么了?

谢谢

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

您可能缺少 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) 类 注释 @Provider 将默认添加为单例,资源 类 注释 @Path 将是每个请求对象(意味着每个创建一个新对象要求)。所以你也可以选择

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

它应该可以正常工作。