1

xsd を使用して JAXB オブジェクトを検証し、適切なエラー メッセージを返したい。しかし、取得できるエラーメッセージは次のとおりです。

cvc-complex-type.2.4.a: 要素「applicant-dto」で始まる無効なコンテンツが見つかりました。「{applicant-id}」のいずれかが必要です。

[cvc-pattern-valid: 値 '12345670' は、タイプ 'ssn' のパターン '^\d{3}-\d{2}-\d{4}$' に関してファセット有効ではありません。, cvc- type.3.1.3: 要素「ssn」の値「12345670」は無効です。]

適切なエラーメッセージを取得したい。誰でも同じことを理解するのを手伝ってもらえますか。

私のxsdは

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="applicant" type="applicantDTO" />

  <xs:complexType name="applicantDTO" >
    <xs:sequence>
      <xs:element name="applicant-id" type="xs:long" minOccurs="1" />
      <xs:element name="first-name" type="name" minOccurs="0" />
      <xs:element name="middle-name" type="xs:string" minOccurs="0" />
      <xs:element name="last-name" type="name" minOccurs="0" />
      <xs:element name="ssn" type="ssn" minOccurs="1" />
      <xs:element name="date-of-birth" type="xs:string" minOccurs="0" />
    </xs:sequence>
  </xs:complexType>

  <xs:simpleType name="name">
    <xs:restriction base="xs:string">
        <xs:pattern value="[a-zA-Z ]{3,30}"></xs:pattern>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="ssn">
    <xs:restriction base="xs:string">
        <xs:pattern value="^\\d{3}-\\d{2}-\\d{4}$"></xs:pattern>
    </xs:restriction>
  </xs:simpleType>

</xs:schema>

私のJAXBオブジェクトは

申請者DTO

XSDで検証するために、コードの下に書いています

@Test
    public void testValidateApplicantDTO() throws Exception {
        ApplicantDTO eDTO = getApplicantDTO();
        SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
        Schema schema = sf.newSchema(new File("src/test/resources/applicant.xsd")); 

        Validator validator =  schema.newValidator();
        CustomErrorHandler errorHandler = new CustomErrorHandler();
        validator.setErrorHandler(errorHandler);

        JAXBContext jc = JAXBContext.newInstance(ApplicantDTO.class);
        JAXBSource source = new JAXBSource(jc, eDTO);
        validator.validate(source);

        System.out.println(errorHandler.getErrors());
    }

カスタムエラーハドラーを作成しました

CustomErrorHandler

public class CustomErrorHandler extends DefaultHandler  {

    List<String> errors = new ArrayList<String>();

    @Override
    public void warning(SAXParseException exception) throws SAXException {
        System.out.println("CustomErrorHandler.warning()");
    }

    @Override
    public void error(SAXParseException exception) throws SAXException {
        System.out.println("CustomErrorHandler.error()");
        errors.add(exception.getLocalizedMessage());
    }

    @Override
    public void fatalError(SAXParseException exception) throws SAXException {
        System.out.println("CustomErrorHandler.fatalError()");
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        super.startElement(uri, localName, qName, attributes);
        System.out.println("CustomErrorHandler.startElement()");
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        super.endElement(uri, localName, qName);
        System.out.println("CustomErrorHandler.endElement()");
    }

    /**
     * @return the errors
     */
    public List<String> getErrors() {
        return this.errors;
    }

    /**
     * @param errors the errors to set
     */
    public void setErrors(List<String> errors) {
        this.errors = errors;
    }
}

エラーリストにエラーメッセージが返されます:

4

0 に答える 0