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

我一直在尝试使用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找不到的页面。

我发现任何具有url "/dukesAge"传入get请求都是由DukesAgeResource类的getText方法处理的。 怎么了?

谢谢

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

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

然后资源应该通过访问资源

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

还有其他方法,但这是便携式方式。 Glassfish使用Jersey,但在Netbeans中从头开始创建Java EE Web应用程序只会导入编译时Java EE标准类(没有Jersey依赖项)。 所以上面的确是你打赌的开始。

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

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


UPDATE

在JAX-RS规范中还指出,如果在getClasses()getSingletons()返回空集, getSingletons()隐式包扫描。 (提供者)默认情况下,使用@Provider注释的类将作为单例添加,使用@Path注释的资源类将是每个请求对象(意味着每个请求都会创建一个新对象)。 所以你可以选择

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

它应该工作相同。

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