Utilisation de Jing avec Google App Engine. Impossible de charger Schemafactory étant donné le schéma de détente ng

StackOverflow https://stackoverflow.com/questions/4983057

Question

D'accord, alors voici ce que j'essaie de réaliser. Je développe une petite application Google App Engine qui génère XML étant donné un objet particulier.

Maintenant, je rencontre des problèmes car j'ai besoin d'utiliser un schéma de détente NG et de le valider contre mon objet de document. Cela fonctionne très bien sur ma machine locale (Eclipse Helios Java EE, Mac OS X Snow Leopard, Google Web Toolkit 2.2.0, App App Engine 1.4.2), mais dès que je me déploie sur App App Engine, mon code échoue et jette une conception illégal dette .

L'exception spécifique est la suivante:

   java.lang.IllegalArgumentException: No SchemaFactory that implements the schema language specified by: http://relaxng.org/ns/structure/1.0 could be loaded

La ou les lignes spécifiques du code dont il se plaint est la suivante:

  System.setProperty(SchemaFactory.class.getName() + ":" + XMLConstants.RELAXNG_NS_URI, "com.thaiopensource.relaxng.jaxp.CompactSyntaxSchemaFactory");
  SchemaFactory schemaFac = SchemaFactory.newInstance(XMLConstants.RELAXNG_NS_URI);

La dernière ligne est la ligne qui lance l'exception.

J'ai essayé de chercher en ligne et j'ai posté dans plusieurs groupes Google, mais personne n'a fait l'idée.

Noter: J'ai pris l'utilisation de certains des code ci-dessus à partir de cet exemple: Comment valider un document XML à l'aide d'un schéma de relaxation NG et JAXP?

Mon soupçon est que App Engine ne charge pas Jing.jar pour une raison quelconque. Je ne sais pas comment je peux vérifier que c'est / n'est pas.

Toute aide serait appréciée! Merci!

Était-ce utile?

La solution 3

Eh bien, j'ai trouvé une sorte de solution de contournement qui supprime complètement l'utilisation (pratiquement piratante) de System.SetProperty.

Il s'avère que Jing a une petite classe appelée "compactsyntaxschemafactory".

Voici comment je l'ai utilisé:

    DocumentBuilderFactory docFactory = null;

    CompactSyntaxSchemaFactory scReader = new CompactSyntaxSchemaFactory();
    URL relaxSchemaURL = new URL("http://example.com/myschema.rng");
    Schema2 relaxSchema = scReader.newSchema(relaxSchemaURL);

    docFactory = DocumentBuilderFactory.newInstance();
    docFactory.setSchema(relaxSchema);

Fonctionnait comme un charme.

Autres conseils

Ce message juste pour clarifier.

La façon habituelle de valider un document XML avec Jing et Relax Ng est:

System.setProperty(SchemaFactory.class.getName() + ":" + XMLConstants.RELAXNG_NS_URI, "com.thaiopensource.relaxng.jaxp.XMLSyntaxSchemaFactory");
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.RELAXNG_NS_URI);
Schema schema = factory.newSchema(new File("path/to/schema.rng"));

Validator validator = schema.newValidator();
validator.validate(new StreamSource(new StringReader(xmlString)));

Maintenant, dans App Engine, les deux premières lignes ne fonctionnent pas et provoquent le lancement d'un jet de lancement de la conception illégale de la réception, comme vous l'avez dit. Alors les échanger avec

SchemaFactory factory = new XMLSyntaxSchemaFactory();

fait l'affaire. Résumé (y compris les importations):

import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import com.thaiopensource.relaxng.jaxp.XMLSyntaxSchemaFactory;

SchemaFactory factory = new XMLSyntaxSchemaFactory();
Schema schema = factory.newSchema(new File("path/to/schema.rng"));

Validator validator = schema.newValidator();
validator.validate(new StreamSource(new StringReader(xmlString)));

Notez que c'est pour les schémas dans la syntaxe XML. Pour la syntaxe compacte, échangez XMLSyntaxschemafactory avec compactsyntaxschemafactory.

Je suppose que System.setProperty() est défaillant, ou plutôt ne pas être utilisé correctement. Selon les documents:

Toutes les propriétés du système et les variables d'environnement sont privées à votre application. La définition d'une propriété système affecte uniquement la vue de votre application de cette propriété et non de la vue de JVM.

Si Schemafactory fait partie du JDK (ce que je pense), vous ne pourrez peut-être pas le réinitialiser. Cependant, vous pouvez avoir plus de chance pour définir la propriété système dans votre fichier appconfig, car cela pourrait être modifié plus tôt dans la séquence de démarrage.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top