如何在没有 web.xml 的情况下使用 Jersey 作为 JAX-RS 实现?
How to use Jersey as JAX-RS implementation without web.xml?
我从 JavaEE 6 读到 web.xml
是可选的。
所以如果没有 web.xml,我如何告诉应用程序服务器使用 Jersey 作为 JAX-RS 规范的实现?
您不必在 web.xml 中指定任何内容。定义一个激活器 class:
@ApplicationPath("/rest")
public class _JaxRsActivator extends javax.ws.rs.core.Application {
static {
//Check some system init on REST init.
Config.initCheck();
}
}
in his answer is correct, as far as how to implement the app configuration with no web.xml; you use an @ApplicationPath
annotation on an Application
子类。
@ApplicationPath("/api")
public class AppConfig extends Application {}
有关部署选项的详细信息,请参阅 Jersey Docs: Chapter 4. Application Deployment and Runtime Environments
或者更常见的是,使用 Jersey 作为实现,我们将扩展 ResourceConfig
(扩展 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 容器启动时,它会扫描 jars 以查找 META-INF/services
文件夹和名为 javax.servlet.ServletContainerInitializer
的文件。此文件应包含一个或多个 ServletContainerInitializer
.
实现的完全限定名称
这个接口只有一个方法
void onStartup(java.util.Set<java.lang.Class<?>> c, ServletContext ctx)
Set<Class<?>
将是 类 的列表,符合 ServletContainerInitializer
实施的 @HandlesTypes
注释中的标准。如果你看看 Jersey 的实现
@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
我不会和别人扯上关系。
你可以看看一些来源...
我从 JavaEE 6 读到 web.xml
是可选的。
所以如果没有 web.xml,我如何告诉应用程序服务器使用 Jersey 作为 JAX-RS 规范的实现?
您不必在 web.xml 中指定任何内容。定义一个激活器 class:
@ApplicationPath("/rest")
public class _JaxRsActivator extends javax.ws.rs.core.Application {
static {
//Check some system init on REST init.
Config.initCheck();
}
}
@ApplicationPath
annotation on an Application
子类。
@ApplicationPath("/api")
public class AppConfig extends Application {}
有关部署选项的详细信息,请参阅 Jersey Docs: Chapter 4. Application Deployment and Runtime Environments
或者更常见的是,使用 Jersey 作为实现,我们将扩展 ResourceConfig
(扩展 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 容器启动时,它会扫描 jars 以查找 META-INF/services
文件夹和名为 javax.servlet.ServletContainerInitializer
的文件。此文件应包含一个或多个 ServletContainerInitializer
.
这个接口只有一个方法
void onStartup(java.util.Set<java.lang.Class<?>> c, ServletContext ctx)
Set<Class<?>
将是 类 的列表,符合 ServletContainerInitializer
实施的 @HandlesTypes
注释中的标准。如果你看看 Jersey 的实现
@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
我不会和别人扯上关系。
你可以看看一些来源...