JAX-RS+EJB资源部署容器确认及web.xml配置必要性咨询
JAX-RS资源在EJB+EAR部署中的容器归属与配置说明
容器归属问题
你的JAX-RS资源会部署在EJB容器中。因为你的类同时标注了@Stateless和@Path,这属于Java EE规范里的EJB风格JAX-RS资源——这类Bean的生命周期、事务管理、依赖注入等核心特性都由EJB容器负责处理,而不是WEB(Servlet)容器。不过不用担心,应用服务器的JAX-RS实现(比如WildFly的RESTEasy、GlassFish的Jersey)会自动桥接EJB容器和REST请求,让你的EJB可以正常对外提供REST服务。
是否需要配置web.xml?
分两种情况来看:
- 大多数现代Java EE环境(Java EE 6及以上)不需要:只要你通过
@ApplicationPath注解定义REST应用的根路径,服务器会自动扫描所有带有@Path的类(包括EJB类)。你只需要创建一个继承自javax.ws.rs.core.Application的空类即可,示例代码如下:
import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application; @ApplicationPath("/my-api") public class RestApiConfig extends Application { // 无需额外代码,服务器会自动探测所有JAX-RS资源 }
- 旧版本Java EE或需要精细配置时需要:如果你用的是Java EE 5及更早的版本,或者需要自定义Servlet参数、安全规则等,就需要在web.xml里配置JAX-RS的Servlet。比如使用Jersey时,配置示例如下:
<web-app> <servlet> <servlet-name>Jersey REST Service</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <init-param> <param-name>javax.ws.rs.Application</param-name> <param-value>com.yourpackage.RestApiConfig</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Jersey REST Service</servlet-name> <url-pattern>/my-api/*</url-pattern> </servlet-mapping> </web-app>
额外注意点
把包含EJB-JAX-RS资源的jar打包进ear时,确保jar放在ear的根目录或者lib目录下,这样应用服务器才能正确识别并加载这些EJB类。如果ear里包含war模块,war也可以共享这个jar里的REST资源,无需重复打包。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

