2015-02-09 17 views
6

Próbuję uzyskać walidację xml pracując ze StAXin naszą aplikacją webową jboss. Przeczytałem this post i poszedłem za przykładem. I wtedy zobaczyłem następujący wyjątek:Walidacja xml ze StAX: Nierozpoznana właściwość 'javax.xml.stream.isInterning'

java.lang.IllegalArgumentException: Source parameter of type  
javax.xml.transform.stax.StAXSource' is not accepted by this validator. 
at org.apache.xerces.jaxp.validation.ValidatorImpl.validate(Unknown Source) 

Zgodnie this post, tutaj problemem było to, JBoss 5.0.1 ma starą wersję Xerces. Dlatego zaktualizowałem go do wersji 2.11.0, zastępując istniejący plik xercesImpl.jar pod numerem jboss-5.0.1.GA/lib/endorsed/. Następnie JBoss nie ruszy, z powodu następującego błędu:

NoClassDefFoundError: org/w3c/dom/ElementTraversal 

zgodnie this post, w nowszych wersjach Xerces zajęcia zostały wydzielone do osobnego pliku jar: XML-apis.jar. Pobrałem najnowszą wersję tego pliku (1.4.01, z grudnia 2009) z the xerces homepage i dodałem go do jboss-5.0.1.GA//lib/endorsed/ - a teraz jboss zaczyna działać poprawnie.

Jak dotąd tak dobrze.

Ale teraz widzę następujący błąd, gdy próbuję wywołać metodę javax.xml.validation.Validator.validate():

java.lang.IllegalArgumentException: Unrecognized property 'javax.xml.stream.isInterning' 

Wydaje się, że żadna z istniejących problemów na SO, który odnosi się do tej nieruchomości. Na pewno nie mogę być jedyną osobą próbującą wykonać walidację xml ze StAX na jboss 5?!

Czy robię coś oczywiście nie tak?

Fragment kodu:

Validator validator = requestSchema.newValidator(); 
StAXSource source = new StAXSource(xmlsr); //an XMLStreamReader 
validator.validate(source); 
+0

od samego początku, jeśli się nie mylę, biblioteka, której używasz, ma przestarzałą wersję javax.xml.stream.XMLStreamReader, która nie ma właściwości "isinterning". mam nadzieję, że to trochę pomaga, ponieważ naprawdę nie wiem, który słoik wprowadza tę klasę do konkretnego przypadku ... – witchedwiz

Odpowiedz

1

Znaleźliśmy dwa rozwiązania tego problemu.

Jedną z opcji jest cienkie zawijanie XmlStreamReader w nowej klasie, która zignoruje wywołanie getProperty, jeśli parametr ma wartość "javax.xml.stream.isInterning", i przekazanie go w inny sposób.

Inną opcją jest użycie XmlEventReader zamiast, który jest mniej wydajny, ale działa bez wymagającego niestandardowego opakowania.