如何在没有web.xml的情况下将Jersey用作JAX-RS实现?

如何在没有web.xml的情况下将Jersey用作JAX-RS实现?,第1张

如何在没有web.xml的情况下将Jersey用作JAX-RS实现?

就如何在没有web.xml的情况下实现应用程序配置而言,@AlexNevidomsky的回答是正确的。您

@ApplicationPath
Application
子类上使用注释。

@ApplicationPath("/api")public class AppConfig extends Application {}

有关部署选项的更多信息,请参见JAX-RS规范-> 2.3发布-> 2.3.2Servlet。

或更常见的是,以Jersey作为实现,我们将进行扩展

ResourceConfig
(extended
Application
)。

@ApplicationPath("api")public class AppConfig extends ResourceConfig {    public AppConfig() {        packages("package.to.scan");    }}

那么这是如何实现的…

首先,并不是所有的Java
EE服务器都使用Jersey。实际上,我唯一知道使用Jersey的是Glassfish和WebLogic。JBoss使用Resteasy。Tom
EE使用CXF。WebSphere使用Apache Wink。这些是我唯一想到的。

所以我想这个问题是“服务器如何知道如何加载JAX-RS应用程序?”

Servlet
3.0引入了可插拔机制,该机制使用

ServletContainerInitializer
。工作原理是,启动Server/ Servlet容器后,它将在jar
meta-INF/services
文件扫描名为的文件的文件夹
javax.servlet.ServletContainerInitializer
。此文件应包含的一个或多个完全限定的实现名称
ServletContainerInitializer

该接口只有一种方法

void onStartup(java.util.Set<java.lang.Class<?>> c, ServletContext ctx)

Set<Class<?>
会的类的列表,在装修标准
@HandlesTypes
上标注
ServletContainerInitializer
的实现。如果您看泽西岛的实施

@HandlesTypes({ Path.class, Provider.class, Application.class, ApplicationPath.class })public final class JerseyServletContainerInitializer         implements ServletContainerInitializer {

您应该注意到一些熟悉的注释类以及

Application.class
。在扫描时,所有与条件匹配的所有类都将添加到
Set
传递给
onStartup
方法中。

如果您扫描其余的源代码,则将看到所有这些类都已完成所有注册。

Resteasy用途

@HandlesTypes({Application.class, Path.class, Provider.class})public class ResteasyServletInitializer implements ServletContainerInitializer

我不会和别人接触。

您可以看一些资料…

  • JerseyServletContainerInitializer
    源代码
  • ResteasyServletInitializer
    源代码
  • JAX-RS规格


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5428098.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-11
下一篇2022-12-11

发表评论

登录后才能评论

评论列表(0条)

    保存