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
相关产品推荐
相关产品推荐

