TomEE Plume 7.0.3/4中非org.superbiz包REST注解类部署失败求助
解决TomEE Plume 7.x中自定义包下REST应用不被识别的问题
我之前也碰到过一模一样的情况——把REST类从默认的org.superbiz移到自定义包后,TomEE就像没看见我的ApplicationConfig一样。这主要是因为TomEE的自动扫描范围没覆盖到新包,或者我们没明确告诉容器要去扫这个包。下面几个方法亲测有效:
方法1:通过web.xml明确指定JAX-RS应用
如果你的项目用了web.xml,直接在里面配置JAX-RS的Servlet,指定你的ApplicationConfig类和要扫描的包就行:
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <servlet> <servlet-name>MyJaxRsApp</servlet-name> <servlet-class>org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet</servlet-class> <!-- 直接指定你的ApplicationConfig类全路径 --> <init-param> <param-name>javax.ws.rs.Application</param-name> <param-value>com.abc.rest.application.ApplicationConfig</param-value> </init-param> <!-- 配置要扫描的包,多个包用逗号分隔 --> <init-param> <param-name>jaxrs.providers</param-name> <param-value>com.abc.rest.application</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>MyJaxRsApp</servlet-name> <url-pattern>/rest-prefix/*</url-pattern> </servlet-mapping> </web-app>
这样TomEE会精准加载你指定的配置类,同时扫描目标包下的所有JAX-RS、EJB注解类。
方法2:用openejb-jar.xml配置EJB扫描
如果你的REST类里用到了EJB,还得确保TomEE能扫到新包下的EJB组件。在WEB-INF下新建openejb-jar.xml,添加以下配置:
<openejb-jar xmlns="http://www.openejb.org/xml/ns/openejb-jar-2.2"> <enterprise-beans> <scan> <package>com.abc.rest.application</package> <!-- 有子包的话加个*就能递归扫描 --> <package>com.abc.rest.application.*</package> </scan> </enterprise-beans> </openejb-jar>
这个配置会让TomEE把指定包下的EJB都捡出来,配合上面的JAX-RS配置一起用就没问题了。
方法3:检查CDI的beans.xml(如果用到了CDI)
要是你的项目用了CDI(比如依赖注入),得确保WEB-INF/beans.xml存在,并且配置了正确的扫描范围:
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" version="1.1" bean-discovery-mode="all"> <!-- 要是只想扫特定包,就加上下面的scan节点 --> <scan> <package>com.abc.rest.application</package> </scan> </beans>
bean-discovery-mode设为all会扫所有包,要是设成annotated,就得确保你的类带有CDI注解(比如@Named、@RequestScoped),或者明确指定扫描包。
最后再确认两个小细节
- 检查你的类有没有正确打包:
ApplicationConfig和其他REST、EJB类必须在WAR的WEB-INF/classes目录下,Maven/Gradle项目要确保编译后的class文件没被漏掉。 - 核对
ApplicationConfig的getClasses()方法:确保里面返回的SimpleRESTPojo、SimpleRESTEJB这些类确实在com.abc.rest.application包下,路径别写错了。
内容的提问来源于stack exchange,提问作者Sudhakar V
相关产品推荐
相关产品推荐

