Validation contre un schéma avec JAXB

J'ai été à la recherche de solutions à ce problème pour beaucoup trop long compte tenu de la façon dont facile que ça donc je viens pour demander de l'aide.

J'ai un Schéma XML que j'ai utilisé avec xjc pour créer mon JAXB de liaison. Cela fonctionne bien lorsque le fichier XML est bien formé. Malheureusement, il ne se plaint pas lorsque le fichier XML n'est pas bien formé. Je ne peux pas comprendre comment faire une validation complète contre le schéma lorsque j'essaie de unmarshall un fichier XML.

J'ai réussi à utiliser un ValidationEventCollector pour gérer les événements, qui travaille pour les erreurs XML comme incompatibles balises, mais ne pas soulever d'événements lorsqu'il y a une balise qui est nécessaire, mais c'est complètement absente.

De ce que j'ai vu validation peut être effectuée againsta schéma, mais vous devez connaître le chemin d'accès au schéma afin de la passer dans le setSchema() la méthode. Le problème que j'ai, c'est que le chemin vers le schéma est stocké dans l'en-tête XML et je ne peux pas savoir au moment de l'exécution, où le schéma va être. C'est pourquoi il est stocké dans le fichier XML:

<?xml version="1.0" encoding="utf-8"?>
<DDSSettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="/a/big/long/path/to/a/schema/file/DDSSettings.xsd">
<Field1>1</Field1>
<Field2>-1</Field2>

...etc

Chaque exemple je vois utilise setValidating(vrai), qui est maintenant obsolète, donc, déclenche une exception.

C'est le code Java que j'ai jusqu'ici, ce qui semble être la seule à faire la validation XML, pas de validation de schéma:

try {
    JAXBContext jc = new JAXBContext() {
        private final JAXBContext jaxbContext = JAXBContext.newInstance("blah");

        @Override
        public Unmarshaller createUnmarshaller() throws JAXBException {
            Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
            ValidationEventCollector vec = new ValidationEventCollector() {
                @Override
                public boolean handleEvent(ValidationEvent event) throws RuntimeException {
                    ValidationEventLocator vel = event.getLocator();
                    if (event.getSeverity() == event.ERROR || event.getSeverity() == event.FATAL_ERROR) {
                        String error = "XML Validation Exception:  " + event.getMessage() + " at row: " + vel.getLineNumber() + " column: " + vel.getColumnNumber();
                        System.out.println(error);
                    }
                    m_unmarshallingOk = false;
                    return false;
                }
            };
            unmarshaller.setEventHandler(vec);

            return unmarshaller;
        }

        @Override
        public Marshaller createMarshaller() throws JAXBException {
            throw new UnsupportedOperationException("Not supported yet.");
        }

        @Override
        @SuppressWarnings("deprecation")
        public Validator createValidator() throws JAXBException {
            throw new UnsupportedOperationException("Not supported yet.");
        }
    };

    Unmarshaller unmarshaller = jc.createUnmarshaller();
    m_ddsSettings = (com.ultra.DDSSettings)unmarshaller.unmarshal(new File(xmlfileName));
} catch (UnmarshalException ex) {
    Logger.getLogger(UniversalDomainParticipant.class.getName()).log(
    Level.SEVERE,
    null, ex);
} catch (JAXBException ex) {
    Logger.getLogger(UniversalDomainParticipant.class.getName()).log(
    Level.SEVERE,
    null, ex);
}

Alors, quelle est la bonne façon de le faire cette validation? Je m'attendais à y être un validate() la méthode sur la JAXB classes générées, mais je suppose que ce serait trop simple pour Java.

source d'informationauteur fwgx