在 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
}
它应该可以正常工作。
我一直在尝试使用 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
}
它应该可以正常工作。