JAX-RS 1.1规范在第6页上说:
如果不存在Application子类,则必须将添加的servlet命名为:
javax.ws.rs.core.Application
添加的servlet是什么?可以是任意servlet吗?
如果存在Application子类,并且已经定义了一个servlet,该servlet的servlet初始化参数为:
javax.ws.rs.Application
同样,这里的“ servlet”是什么?
如果存在不由现有Servlet处理的Application子类,则必须使用Application子类的完全限定名称来命名ContainerInitializer添加的Servlet。
“ ContainerInitializer添加的servlet”是否意味着该servlet是自动添加的?配置如何?
目前,我既不使用Application类也不使用web.xml,并且它可以工作(在GlassFish
3.1中)。这种部署机制是否需要完整的类路径扫描,而大型库可能会比较慢?
如何部署在Servlet容器上?
网络中存在许多令人困惑的配置选项。请参阅带有web.xml中上下文参数的示例(对我不起作用!)。部署JAX-RS应用程序的首选方法是什么?
有许多选项可用于部署到Java EE 6容器(更具体地讲是Servlet 3.0实现):
最简单的是:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_3_0.xsd" version="3.0">
<servlet>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
然后,在Web应用程序中找到的所有@Path
和@Provider
类都将在servlet URL模式为的“默认” JAX-
RS应用程序中可用"/rest/*"
。
如果您有一个或多个扩展类,则javax.ws.rs.core.Application
可以这样指定:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_3_0.xsd" version="3.0">
<servlet>
<servlet-name>com.example.jaxrs.MyApplication</servlet-name>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>com.example.jaxrs.MyApplication</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
如果您只希望在URL上返回特定的@Path
/
@Provider
类集,则可能需要执行上述操作(因此,您可以在上面的第二个MyApplication2中使用不同的URL模式)。
您也可以web.xml
完全跳过整个过程,仅注释您的MyApplication
类wih
@ApplicationPath
(将用作URL模式)。我建议web.xml
在任何情况下都保留,因为无论如何您可能都必须在其中添加有关Web应用程序的其他信息。
如果您想知道它的servlet-class
来源,环境会自动添加它。您可以通过查看Servlet 3.0来了解一下ServletContext
。
我正在使用RAD和WAS7.0.23,并尝试在其中部署jax-rs。但是我在部署描述符(web.xml)中发现了以下错误。 错误404:javax.Servlet.unavailableException:SRVE0200E:Servlet[com.ibm.websphere.jaxrs.server.ibmrestServlet]:找不到所需的类-class java.lang.ClassNot
经过谷歌搜索,有人说可能是webshpere服务器已经包含了ASM。因此,我从app.war web-INF/lib中删除了asm.jar。但它仍然存在错误。
这是MyResource: 和我的web.xml: 在客户端,我使用这个url:http://localhost:8080/[projectname]/webapi/helloworld 谢了!
14:32:42,537错误[org.jboss.msc.service.fail](ServerService线程池--316)MSC000001:未能启动服务jboss.web.deployment.default-host./search-rest:org.jboss.msc.msc.service.startException.匿名服务中的服务jboss.web.deployment.de
我正在迁移一个遗留服务框架,该框架使用java序列化/反射来注册服务,并将它们作为远程endpoint(javabin over http)或本地调用无缝地调用。我已经将远程调用替换为jerseyendpoint。并使用基于hk2 aop的拦截器重新构建了现有框架的部分拦截能力。当远程客户端调用endpoint时,它工作正常。现在,我需要对服务方法的本地调用执行相同的操作,并且能够使用与远程服务方
JAX-RS 规范 定义了可以编程创建一个 JAX-RS 应用端点(即容器)给任何 Application 子类的实例的能力。举例,Jersey 支持 Grizzly HttpHandler 实例的创建,如下: HttpHandler endpoint = RuntimeDelegate.getInstance() .createEndpoint(new MyApplication