使用CXF的JAXB模式验证错误 - 发生JAXBException:cvc-elt.1:找不到元素的声明

时间:2014-12-12 15:20:18

标签: java xml jaxb xsd cxf

我的 REST 服务 CXF 3.0.1 ,在 HTTP POST 中接受 XML 消息有效载荷。通过 JAXB XML 有效内容解组为对象。

我正在尝试通过 XSD 架构验证 XML ,并在 CXF 中配置 XSD 但我一直得到以下错误

发生了JAXBException:cvc-elt.1:无法找到元素'事件' ... cvc-elt.1的声明:找不到元素&'39;事件&#39的声明; ..

注意:事件是我的根元素

据我所知, XSD 已成功注册 CXF ,但 JAXB 方面出现问题。

我尝试了许多与该错误相关的可能解决方案但没有效果。

任何想法

由于

这是我的配置

服务

@Path("incident") 
public class CreateIncident { 
        @POST 
        @Consumes({ MediaType.APPLICATION_XML}) 
        public Response createIncident(Incident incident) { 
                        //code 
        } 
}

JAXB对象

@XmlRootElement(name = "incident") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Incident extends Event { 
        public Incident() { 
                super("incident"); 
        } 

        @XmlElement
        private String importProfile;

        @XmlElement
        private String eventTitle; 

        public String getImportProfile() { 
                return importProfile; 
        } 

        public void setImportProfile(String importProfile) { 
                this.importProfile = importProfile; 
        } 

        public String getEventTitle() {
                return eventTitle;
        }

        public void setEventTitle(String eventTitle) {
                this.eventTitle = eventTitle;
        }
}

事件:

public class Event {

    String eventType;

    public Event(String eventType) {
        this.eventType = eventType;
    }

    public String getEventType(){
        return eventType;
    }
}

我的XSD

<?xml version="1.0" encoding="UTF-8"?>
<schema
    xmlns="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.ba.com/schema/BAassystWrapper/incident"
    elementFormDefault="qualified">
    <element name="incident">
        <complexType>
            <sequence>
                <element name="importProfile">
                    <simpleType>
                        <restriction base="string">
                            <minLength value="1"></minLength>
                            <maxLength value="254"></maxLength>
                        </restriction>
                    </simpleType>
                </element>
                <element name="eventTitle">
                    <simpleType>
                        <restriction base="string">
                            <minLength value="1"></minLength>
                            <maxLength value="890"></maxLength>
                        </restriction>
                    </simpleType>
                </element>
            </sequence>
        </complexType>
    </element>
</schema>

我传递的XML

<incident>
    <importProfile>Test text</importProfile>
    <eventTitle>Test text</eventTitle>
</incident>

CXF配置

<jaxrs:server address="/">
                <jaxrs:schemaLocations>
                        <jaxrs:schemaLocation>classpath:xsd/incident.xsd</jaxrs:schemaLocation>
                </jaxrs:schemaLocations>
                <jaxrs:serviceBeans>
                        <bean class="com.ba.sysman.services.events.CreateIncident"></bean>
                </jaxrs:serviceBeans>
                <jaxrs:features>
                        <cxf:logging/>
                </jaxrs:features>
</jaxrs:server>

2 个答案:

答案 0 :(得分:1)

根元素需要是名称空间限定的。因此,传入的XML需要类似于:

<incident xmlns="http://www.ba.com/.......">

答案 1 :(得分:0)

由于您尚未在@XmlRootElement中定义namesapce,请从输入中删除命名空间。

@XmlRootElement(name = "incident") 
@XmlAccessorType(XmlAccessType.FIELD)
@XmlSeeAlso({Event.class}) 
public class Incident extends Event { 
        public Incident() { 
                super("incident"); 
        }

    //fields, getters and setters
}

在事件类中添加默认构造函数

public Event(){

}

然而,最好使用xjc pluginwadl2java/wsdl2java plugin并从xsd生成jaxb类,这会在您经常更改xsd并使用xmlns时节省大量时间