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

时间:2015-01-24 18:57:23

标签: java web-services rest glassfish 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找不到的页面。

我发现任何包含"/dukesAge"网址的传入请求都是由DukesAgeResourcegetText方法处理的。什么'错?

由于

2 个答案:

答案 0 :(得分:6)

您可能错过了JAX-RS应用程序servlet。您可以在web.xml中定义它,或者如果您想要更少xml,则可以使用Application子类。 IMO最简单的方法就是使用Application注释的@ApplicationPath子类。将创建一个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
}

它应该可以正常工作。

答案 1 :(得分:0)

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