Des*_*PRG 3 java web-services jax-rs java-ee
我已经读过java EE6中的web.xml是可选的.所以没有web.xml,我如何告诉应用服务器使用Jersey作为JAX-RS规范的实现?
Pau*_*tha 13
@AlexNevidomsky在他的回答中所写的内容是正确的,至于如何在没有web.xml的情况下实现app配置; 您@ApplicationPath在Application子类上使用注释.
@ApplicationPath("/api")
public class AppConfig extends Application {}
Run Code Online (Sandbox Code Playgroud)
有关部署选项的更多信息,请参阅JAX-RS规范 - > 2.3发布 - > 2.3.2 Servlet
或者更常见的是,使用Jersey作为实现,我们将扩展ResourceConfig(扩展Application).
@ApplicationPath("api")
public class AppConfig extends ResourceConfig {
public AppConfig() {
packages("package.to.scan");
}
}
Run Code Online (Sandbox Code Playgroud)
那么这是如何实现的......
首先,并非所有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)
Run Code Online (Sandbox Code Playgroud)
该Set<Class<?>会的类的列表,在装修标准@HandlesTypes上标注ServletContainerInitializer的实现.如果你看看泽西岛的实施
@HandlesTypes({ Path.class, Provider.class, Application.class, ApplicationPath.class })
public final class JerseyServletContainerInitializer
implements ServletContainerInitializer {
Run Code Online (Sandbox Code Playgroud)
你应该注意到一些熟悉的注释类,以及Application.class.在扫描时,所有这些符合条件的类都被添加到Set传递给onStartup方法中.
如果您扫描其余的源代码,您将看到所有这些类的注册都已完成.
Resteasy使用
@HandlesTypes({Application.class, Path.class, Provider.class})
public class ResteasyServletInitializer implements ServletContainerInitializer
Run Code Online (Sandbox Code Playgroud)
我不会接触别人.
你可以看一些来源......
| 归档时间: |
|
| 查看次数: |
4738 次 |
| 最近记录: |