JAX-RS 1.1规范在第6页说:
如果没有Application子类 添加的servlet必须命名为:
javax.ws.rs.core.Application
添加的servlet是什么?它可能是一个任意的servlet吗?
如果存在Application子类 并且已经定义了一个servlet 有一个servlet初始化 参数名为:
javax.ws.rs.Application
同样,这里的“servlet”是什么?
如果存在Application子类 这不是由一个人处理的 现有的servlet然后是servlet 由ContainerInitializer添加必须 用完全限定名称命名 应用程序子类。
“ContainerInitializer添加的servlet”是否意味着自动添加了servlet?配置如何?
目前我既不使用Application类也不使用web.xml,它可以使用(使用GlassFish 3.1)。这种部署机制是否需要完整的类路径扫描,这对于大型库来说可能会很慢?
如何在Servlet容器上部署?
网络中存在令人困惑的配置选项。看到这个example with context params in the web.xml(对我不起作用!)。部署JAX-RS应用程序的首选方法是什么?
答案 0 :(得分:61)
有许多选项可用于部署到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
类将在“默认”JAX-RS应用程序中可用,其servlet URL模式为"/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>
如果您只希望在网址上返回特定的@Path
/ @Provider
类,那么您可能希望执行上述操作(因此您可以在第二个MyApplication2上使用不同的网址格式)
您也可以完全跳过整个web.xml
,只需注释MyApplication
类@ApplicationPath
,该web.xml
类将用作网址格式。我建议保留servlet-class
,因为你可能不得不在那里添加有关Web应用程序的其他信息。
如果您想知道ServletContext
来自何处,它会自动添加到环境中。您可以通过查看Servlet 3.0 {{1}}获得一个想法。
答案 1 :(得分:1)
使用WAS 8.5,我将web.xml更改为:
<servlet>
<servlet-class>com.ibm.websphere.jaxrs.server.IBMRestServlet</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.tada.rest.RestApplication</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
</servlet>
<servlet-mapping>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
我的RestApplication看起来像:
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.core.Application;
public class RestApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> sets = new HashSet<Class<?>>();
sets.add(RestService.class);
return sets;
}
}
我的RestService看起来像
@Path("/tada")
public class RestService {
@GET
public String getSomething() {
return "tada";
}
}
我在pom.xml中添加了依赖项:
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.0</version>
</dependency>
答案 2 :(得分:0)
使用Servlet3.0,请按照此操作。这对我有用。
<servlet>
<description>JAX-RS Tools Generated - Do not modify</description>
<servlet-name>JAX-RS Servlet</servlet-name>
<servlet-class>com.ibm.websphere.jaxrs.server.IBMRestServlet</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>your.restsrv.config.RESTConfig</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<enabled>true</enabled>
<async-supported>false</async-supported>
</servlet>
<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>
<servlet-mapping>
<servlet-name>JAX-RS Servlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
答案 3 :(得分:-3)
正如我在上面的评论中所说,这一切都取决于你想要使用的框架。
泽西岛的http://syrupsucker.blogspot.com/2008/10/deploying-jersey-in-tomcat-60.html RESTeasy的http://syrupsucker.blogspot.com/2008/10/deploying-resteasy-in-tomcat-60.html
据我所知,JAX-RS不包含部署规范。