2017-08-17 4 views
0

J'envoie un paquet xml à un webservice. Le xml est converti en objet par jaxb et je veux le valider par rapport à xsd. Le paquet xml a une étiquette appelée détails NSDG.La validation du schéma JAXB ne fonctionne pas correctement

<NSDGDetails> 
<Keys> 
<Key Type="sapconnector" /> 
</Keys> 
<TargetDetails> 
<Organisation>Gateway</Organisation> 
</TargetDetails> 
<NSDGValidation> 
<Processed>no</Processed> 
<Result>pass</Result> 
</NSDGValidation> 
<ChannelRouting> 
<Channel> 
<URI>e:channeluri</URI> 
<Product>e:channelproduct</Product> 
<Version>e:channelverion</Version> 
</Channel> 
<ID Type="">id</ID> 
<Timestamp>2015-01-12T17:24:05.835+05:30</Timestamp> 
</ChannelRouting> 
</NSDGDetails> 

Maintenant, j'attends que quand je passe quelque chose comme « ABCD » dans la balise NSDGDetails

<NSDGDetails>abcd<NSDGDetails>

alors je devrais obtenir une erreur lors de la validation de la demande par rapport à l'xsd.

Ci-dessous mon code pour la validation du schéma

JAXBContext sdjaxbContext = 
    JAXBContext.newInstance(SubmitDocument.class); 
    JAXBContext NsdgMsgJaxbContext = 
    JAXBContext.newInstance(NSDGMessage.class); 
    SchemaFactory sf = 
    SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
    Schema schema = sf.newSchema(new File("xsd0.xsd")); 

    Marshaller marshaller = NsdgMsgJaxbContext.createMarshaller(); 
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
    marshaller.setSchema(schema); 
    ValidationEventCollector validationCollector = new 
    EsangamValidationEventHandler(); 
    marshaller.setEventHandler(validationCollector); 
    marshaller.marshal(message, System.out); // where message is the object of NSDGMessage class 
    if(validationCollector.hasEvents()) 
    { throw some errror. I am expecting an error in case of <NSDGDetails>random value </NSDGetails> 
    } 

Mais, je ne reçois aucune erreur dans ce scénario. Le fichier xsd et la classe NSDGMessage générée par JAXB se trouvent ici xsd NSDGMessage

Une chose que j'ai essayé est de convertir l'objet de message à chaîne et a constaté que

 <NSDGDetails>abcd<NSDGDetails> is changed to <NSDGDetails><NSDGDetails>
Je crois que c'est la raison pour laquelle le validateur ne peut pas pour intercepter l'erreur car les données non valides sont supprimées.

Helpp ...

Répondre

0

Quand vous allez de XML à des objets Java, vous devez utiliser le unmarshaller à la place.

Pour un exemple simple voir question similaire dans How to validate an XML against schema using JAXB?

+0

Salut Escay, le lien fourni dans la réponse dit que nous pouvons activer la validation tout en faisant à la fois marshaling et unmarshalling.I a choisi processus marshaling depuis que je suis déjà un objet java mais ça ne marche pas. J'ai également essayé le processus unmarshalling mais j'ai remarqué que lorsque je convertis mon objet java en chaîne XML, le contenu invalide disparaît et la balise est laissée vide par exemple. abcd est remplacé par . Maintenant que j'ai autorisé les balises vides, cela ne se coince pas dans la validation. Existe-t-il une solution à ça? – Asim

+0

Oui, mais votre question commence par passer de l'objet XML à l'objet Java, ce qui nécessite unmarshalling. Votre exemple de code pour la validation de schéma va de l'objet Java au XML (marshalling), ce qui est incorrect en fonction du début de la question. Le xsd fourni dans votre question est trop long pour arriver au point. En général, la question est un doublon de celui que j'ai mentionné. Il y a beaucoup d'exemples disponibles, reproduisez les exemples et remplacez leur xsd par votre xsd et allez de l'avant. – Escay