Ich bin neu im Frühling. Eine Sache, die mich verwirrt, ist, dass ich manchmal XML-Konfigurationsdateien mit versionierten Schemas sehe, manchmal aber auch mit nicht versionierten. Zum Beispiel sehe ich manchmal so etwas
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<context:annotation-config/>
<context:component-scan base-package="base.package"/>
</beans>
Und manchmal so:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
<context:component-scan base-package="base.package"/>
</beans>
Beachten Sie, dass die Schemata spring-beans
und spring-context
in den beiden Beispielen unterschiedlich sind.
Meine Frage ist also, welchen Stil würden Sie verwenden und warum? Wird das versionierte Schema in Zukunft nicht mehr verfügbar sein und wird das nicht versionierte Schema mit einer aktuellen Anwendung kompatibel bleiben, wenn Spring das Schema aktualisiert?
Eine Nebenfrage ist, wo finde ich eine Liste der versionierten Federschemata?
Danke vielmals!
Antworten:
Es wird empfohlen, die "versionlosen" XSDs zu verwenden, da sie der aktuellen Version des Frameworks zugeordnet sind, das Sie in Ihrer Anwendung verwenden.
Anwendungen und Tools sollten niemals versuchen, diese XSDs aus dem Web abzurufen , da diese Schemas in den JARs enthalten sind. Wenn dies der Fall ist, bedeutet dies normalerweise, dass Ihre App versucht, eine XSD zu verwenden, die aktueller als die von Ihnen verwendete Framework-Version ist, oder dass Ihre IDE / Ihr Tool nicht ordnungsgemäß konfiguriert ist.
Meines Wissens gibt es nur einen Fall, in dem Sie bestimmte XSD-Versionen verwenden möchten: Wenn Sie versuchen, ein XML-Attribut zu verwenden, das in einer neueren Version veraltet / geändert wurde. Das kommt gelinde gesagt nicht oft vor.
Auf jeden Fall sollte das Spring-Team die versionierten Schemas für Spring 5.0 löschen , siehe SPR-13499 .
Mehr zu "versionless == aktuelle Version":
Diese XSD-Dateien sind in Spring JARs enthalten - die "versionlose" XSD wird während des Builds der neuesten Version zugeordnet (siehe die spring.schemas- Dateien, die diesen Link tatsächlich herstellen). Außerdem werden die online verfügbaren Dateien auf die gleiche Weise erstellt (siehe das Ziel "schemaZip" im Gradle-Build ).
quelle
Spring Integration
XSDs ohne URL-Version der alten Version 1.0 entsprechen, führt dies zu sporadischen Fehlermarkierungen in meinen XML-Dateien im Eclipse-Editor. Sehen Sie dieimportant note
Online-XSD hier: springframework.org/schema/integration/spring-integration.xsd oder hier: springframework.org/schema/integration/xml/…Ich bin mir nicht sicher, ob es sich um eine Anleitung handelt, aber meine persönliche Präferenz ist es, auf die nicht versionierten Schemas zu verweisen. Wenn Sie im Allgemeinen gegen die neueren Versionen der Spring-Projekte (Spring Core, Integration usw.) arbeiten, können Sie dies Beziehen Sie sich auf die nicht versionierten Schemata.
Die nicht versionierten Schemas verweisen auf die neueste Version der Projekte, sodass es möglich ist, dass sie nicht die richtige Grammatik haben, wenn Sie eine wirklich alte Version von Spring verwenden (z. B. Version 2.5 gegen die aktuell veröffentlichte Version 4.0). In solchen Fällen ist dies möglicherweise besser um auf die versionierten Schemata zu verweisen.
Ein weiterer Punkt, den Sie hier ansprechen sollten , ist, dass es nach Möglichkeit besser ist, XML vollständig zu vermeiden und den Java-basierten @ Configuration- Stil zu verwenden, um Ihre Spring Beans zu konfigurieren.
quelle
Ich weiß, dass die Frage älter als zwei Jahre ist, aber ich gehe davon aus, mit Vorsicht vorzugehen.
In meinem Fall entwickelte ich ein eigenständiges CLI-Tool, ein Glas mit Gläsern. Und wenn meine deklarierten XSDs versionlos waren, bemerkte ich sehr seltsame Fehler. Betrachten Sie das folgende XML-Fragment:
Ohne die Versionen verursacht das
value-separator
Attribut im Platzhalter der Eigenschaft den folgenden Fehler:org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 22 in XML document from class path resource [META-INF/slitools/sli-cli-applicationContext.xml] is invalid; nested exception is org.xml.sax.SAXParseException: cvc-complex-type.3.2.2: Attribute 'value-separator' is not allowed to appear in element 'context:property-placeholder'. at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:399)
Man könnte versuchen zu sehen, was um alles in der Welt über transitive Abhängigkeiten gezogen wird (obwohl eine sorgfältige Untersuchung ergab, dass wir die richtigen Gläser mit den richtigen xsds gezogen haben) und sichergestellt haben, dass wir die richtige Eigenschaft haben, die mit dem Schatten-Plugin verschmilzt, als wir das Uber erstellt haben -Gläser.)
Offensichtlich YMMV. Wenn es für ein Projekt funktioniert, desto besser. Aber wenn Sie jemals merkwürdige Fehler sehen, die sich jeder Erklärung entziehen, und Sie nicht die Bandbreite haben, um sie auf die Grundursache zu reduzieren, ist es besser, genau zu sein.
Das Gegenargument dazu ist, dass Sie sicherstellen müssen, dass die explizite xsd-Version korrekt ist, wenn Sie jemals die Version Ihrer Spring-Abhängigkeiten ändern. In der Software dreht sich alles um Kompromisse (und darum zu wissen, worauf Sie sich bei Ihren Entscheidungen einlassen).
quelle
Ich habe mich für den Frühlingskurs auf udemy eingeschrieben. Ich folgte jedem Schritt, den mein Ausbilder mir zeigte. Wenn Sie also spring mvc und den Ruhezustand verwenden, kann dieser Fehler auftreten. Fehler beim Lesen des Schemadokuments ' http://www.springframework.org/schema/tx/spring-tx.xsd ' usw. für:
<mvc:annotation-driven/> and <tx:annotation-driven transaction-manager="myTransactionManager" /> elements
In meiner Frühlingskonfigurationsdatei hatte ich diese beiden URLs
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
in xsi: schemaLocation, durch das ich ersetzt habe
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
Eigentlich habe ich diese beiden Seiten http://www.springframework.org/schema/mvc/ und http://www.springframework.org/schema/tx/ besucht und gerade die neueste Version von spring-mvc und spring-tx hinzugefügt, dh , spring-mvc-4.2.xsd und spring-tx-4.2.xsd
Meiner Meinung nach ist es daher eine gute Praxis, Version no explizit anzugeben. Hoffe das hilft. Vielen Dank.
quelle
Sie finden die Datei META-INF / spring.schemas in Ihrem Jar. Diese Datei definiert alle kompatiblen xsd-Versionen. Wenn Sie auf eine URL ohne Versionsnummer verweisen, ist diese standardmäßig mit Ihrer Jar-Datei kompatibel. Solange Sie nicht zwei verschiedene Versionen von Spring Jar im Klassenpfad haben, weist Ihre Anwendung keine Laufzeitfehler auf.
quelle
Erwägen Sie die Verwendung versionloser xsd's. Dadurch nimmt das Werkzeug die Version des xsd auf, die mit der Version des von Ihnen verwendeten Federglases übereinstimmt (siehe die Datei spring.schemas in Ihrem Glas). Im Falle einer Inkompatibilität beim Upgrade Ihrer Spring-Bibliotheken (was eigentlich selten sein sollte) sollten Sie diese während des Builds abfangen können.
Dies bietet die Möglichkeit zu entscheiden, ob für diese eine Datei versioniertes xsd eingeführt werden muss oder ob tatsächlich ein archaisches und veraltetes Attribut / Element verwendet wird. Hoffentlich wird es das später sein.
Andernfalls besteht das Risiko, dass ein möglicherweise veraltetes Attribut / Element für immer verwendet wird.
quelle