Проверка верблюда против xsd: не может найти объявление элемента 'Адрес' - PullRequest
0 голосов
/ 13 мая 2019

Я хочу проверить верблюда на xsd, но получаю ошибку:

Не удается найти объявление элемента 'Address'

Я сделал эту проблему для небольших файлов xml / xsd.

validation.xsd:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:complexType name="Address">
    <xs:sequence>
      <xs:element name="Street" type="xs:string" />
      <xs:element name="HouseNo" type="xs:string" />
    </xs:sequence>
  </xs:complexType>
</xs:schema>

xml вопрос:

<?xml version="1.0" encoding="UTF-8"?>
<Address>
    <Street>string</Street>
    <HouseNo>string</HouseNo>
</Address>

конфигурация верблюда:

@Component
public class CamelRoute extends RouteBuilder {
    @Override
    public void configure() throws Exception {
        restConfiguration().component("servlet") // configure we want to use servlet as the component for the rest DSL
                .bindingMode(RestBindingMode.json_xml) // enable json/xml binding mode
                .dataFormatProperty("prettyPrint", "true") // output using pretty print
                .contextPath("/c/api/")
                .apiContextPath("/api-doc")  // enable swagger api
                .apiProperty("api.version", "2.0.0")
                .apiProperty("api.title", "I")
                .apiProperty("api.description", "I")
                .apiProperty("api.contact.name", "A")
                .apiProperty("cors", "true"); // enable CORS

        // error handling to return custom HTTP status codes for the various exceptions
        onException(StartProcessException.class)
                .handled(true)
                // use HTTP status 400 when input data is invalid
                .setHeader(Exchange.HTTP_RESPONSE_CODE, constant(400))
                .setBody(simple("Invalid input data"));

        rest()
                .description("I")
                .consumes("application/xml").produces("application/xml")
                .post("/start").type(Address.class)
                .bindingMode(RestBindingMode.json_xml).description("S")
                .route().routeId("I").log("Message send: \n ${body}")
                .to("validator:file:src/main/resources/validation.xsd")
                .endRest();
    }
}

Ошибка:

org.apache.camel.support.processor.validation.SchemaValidationException: Проверка не удалась для: com.sun.org.apache.xerces.internal.jaxp.validation.SimpleXMLSchema@79c47167 ошибки: [org.xml.sax.SAXParseException: cvc-elt.1.a: не удается найти объявление элемента 'Адрес'. Строка: 2, столбец: 10

Адрес класса DTO:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="Address")
@ToString
public class Address {
    @XmlElement(name = "Street", required = true)
    protected String street;
    @XmlElement(name = "HouseNo", required = true)
    protected String houseNo;
    // getters, setters
   }

1 Ответ

1 голос
/ 14 мая 2019

Ошибка правильная, потому что ваш XML неверен в соответствии с вашей схемой.Вы объявили сложный тип Address, но проверка ищет Элемент Address.

Исправьте вашу схему следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="Address">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Street" type="xs:string"/>
                <xs:element name="HouseNo" type="xs:string"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...