You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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),或者明确指定扫描包。

最后再确认两个小细节

  1. 检查你的类有没有正确打包:ApplicationConfig和其他REST、EJB类必须在WAR的WEB-INF/classes目录下,Maven/Gradle项目要确保编译后的class文件没被漏掉。
  2. 核对ApplicationConfig的getClasses()方法:确保里面返回的SimpleRESTPojo、SimpleRESTEJB这些类确实在com.abc.rest.application包下,路径别写错了。

内容的提问来源于stack exchange,提问作者Sudhakar V

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:49:06