当前位置: 首页 > 面试题库 >

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

纪枫
2023-03-14
问题内容

我一直在尝试使用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的get请求"/dukesAge"都由DukesAgeResourcegetText方法处理。怎么了?

谢谢


问题答案:

您可能会缺少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文档中查看其他部署选项。对于某些选项,您可能需要添加一些Jersey编译时依赖性。这就是我刚才提到的原因。无需其他罐子。

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

更新

JAX-
RS规范中还指出,如果getClasses()and中返回了空集,则getSingletons()应该进行隐式包扫描。(提供者)@Provider默认情况下,带有注释的类将作为单例添加,带有注释的资源类@Path将是按请求的对象(这意味着将在每个请求中创建一个新对象)。所以您可以选择拥有

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

它应该工作相同。



 类似资料:
  • 我创建了一个原型为maven archetype webapp的maven项目,然后为了将我的应用程序公开为rest webservice,我正在使用RestEasy,但是在rest应用程序中实现后,我无法访问我创建的URL。请告诉我我做错了什么。感谢您阅读此问题。 我的UserManagementController如下: 我的MyRestWS. java如下: 我的网站。xml如下: 该应用程

  • 我在尝试用@Inject搭配JAX-RS。我的问题是@Inject只在Servlets中有效。在JAX资源中,我得到一个空指针,我不知道我做错了什么。我的代码如下所示: Pom.xml文件 豆类.xml 网页.xml包含: <代码> 工人阶级: 服务控制器。startTweetListener()和serviceController。stopTweetListener()工作。没有空指针。 非工人

  • 我想试试wildfly swarm。我用Jax-rs-fraction和一个简单的hello-world资源创建了一个项目。我查过了,但找不到404。 这是我的pom。xml 这是我的Jax rs资源 如您所见,这非常简单。也许我错过了什么。我没有添加@Application ationPath注释类,因为根据留档(https://wildfly-swarm.gitbooks.io/wildfly

  • JAX-RS (JSR 311) 是一个社区驱动的标准用于使用 Java 构建 RESTful Web 服务。

  • 谢谢 下面抛出的错误/警告日志汇总。 警告:检测到以下警告:警告:[javax.ws.rs.sse.sseEventSink]的HK2服务具体化失败,出现异常:MultiException堆栈%1(共%2个java.lang.NoSuchMethodException:在javax.ws.rs.sse.sseEventSink类中找不到合适的构造函数。在org.glassfish.jersey.i

  • 如何从JAX-RS资源方法访问原始请求主体,例如或?对于特定的资源类或方法,我希望容器绕过任何,但是项目中有其他资源应该使用一些。 我已经尝试过了,但是它将调用注册的s并且无法将结果分配给()。 我用的是泽西1.11。