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

Eclipse标记ejb-jar.xml中<ejb-class>无效的原因及解决办法

EJB 3.1配置文件在Eclipse中验证错误的解决方法

我维护一个遗留EJB项目,使用Eclipse开发,ejb-jar.xml配置内容如下:

<ejb-jar version="3.1" xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd">
  <display-name>Verwaltung</display-name>
  <enterprise-beans>
    <session>
      <description>EJB für den Zugriff auf die Configuration</description>
      <ejb-name>EnvironmentEntries</ejb-name>
      <init-on-startup>true</init-on-startup>
      <ejb-class>
        some.package.name.EnvironmentEntries
      </ejb-class>
      <session-type>Singleton</session-type>
    </session>
  </enterprise-beans>
</ejb-jar>

但Eclipse抛出如下验证错误:

cvc-complex-type.2.4.a:发现以元素<ejb-class>开头的无效内容。预期为以下元素之一:{
"http://java.sun.com/xml/ns/javaee":concurrency-management-type,
"http://java.sun.com/xml/ns/javaee":concurrent-method, 
"http://java.sun.com/xml/ns/javaee":depends-on,
"http://java.sun.com/xml/ns/javaee":init-method,
"http://java.sun.com/xml/ns/javaee":remove-method,
"http://java.sun.com/xml/ns/javaee":async-method,
"http://java.sun.com/xml/ns/javaee":transaction-type,
"http://java.sun.com/xml/ns/javaee":after-begin-method,
"http://java.sun.com/xml/ns/javaee":before-completion-method,
"http://java.sun.com/xml/ns/javaee":after-completion-method,
"http://java.sun.com/xml/ns/javaee":around-invoke,
"http://java.sun.com/xml/ns/javaee":around-timeout,
"http://java.sun.com/xml/ns/javaee":env-entry,
"http://java.sun.com/xml/ns/javaee":ejb-ref,
"http://java.sun.com/xml/ns/javaee":ejb-local-ref,
"http://java.sun.com/xml/ns/javaee":service-ref,
"http://java.sun.com/xml/ns/javaee":resource-ref,
"http://java.sun.com/xml/ns/javaee":resource-env-ref,
"http://java.sun.com/xml/ns/javaee":message-destination-ref,
"http://java.sun.com/xml/ns/javaee":persistence-context-ref,
"http://java.sun.com/xml/ns/javaee":persistence-unit-ref,
"http://java.sun.com/xml/ns/javaee":post-construct,
"http://java.sun.com/xml/ns/javaee":pre-destroy,
"http://java.sun.com/xml/ns/javaee":data-source,
"http://java.sun.com/xml/ns/javaee":post-activate,
"http://java.sun.com/xml/ns/javaee":pre-passivate,
 "http://java.sun.com/xml/ns/javaee":security-role-ref,
"http://java.sun.com/xml/ns/javaee":security-identity}
'。

我对照ejb-jar_3_1.xsd和TomEE官方文档后认为配置正确,尝试暂停Eclipse中所有验证器但问题仍未解决,请问问题出在哪里?该如何修复或消除这个错误?


问题根源

EJB 3.1的ejb-jar.xml对<session>节点下的元素顺序有严格的Schema约束,你的配置里<init-on-startup>放在了<ejb-class>之前,<session-type>又放在了<ejb-class>之后,完全违反了XSD定义的元素顺序规则。

按照EJB 3.1 XSD的要求,Singleton类型Session Bean的核心元素顺序应为:
<description> → <ejb-name> → <session-type> → <ejb-class> → 其他可选元素(如<init-on-startup>)

修复步骤

调整<session>节点内的元素顺序,将<session-type>移到<ejb-class>之前,<init-on-startup>移到<ejb-class>之后:

<ejb-jar version="3.1" xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd">
  <display-name>Verwaltung</display-name>
  <enterprise-beans>
    <session>
      <description>EJB für den Zugriff auf die Configuration</description>
      <ejb-name>EnvironmentEntries</ejb-name>
      <session-type>Singleton</session-type>
      <ejb-class>
        some.package.name.EnvironmentEntries
      </ejb-class>
      <init-on-startup>true</init-on-startup>
    </session>
  </enterprise-beans>
</ejb-jar>

额外处理方案(若不想调整顺序)

  • 右键项目 → Properties → Validation → 找到XML Schema Validator,禁用对当前项目的验证
  • 临时删除ejb-jar.xml顶部的xsi:schemaLocation属性(不推荐,会失去Schema语法提示和自动补全功能)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 16:15:22