Frühlingskonfigurations-XML-Schema: mit oder ohne Version?

75

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-beansund spring-contextin 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!

JBT
quelle

Antworten:

94

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 ).

Brian Clozel
quelle
Wie wir wissen, werden die Informationen in der schemaLocation als "Hinweis" für den XML-Prozessor bereitgestellt. Wenn der XML-Prozessor die XML analysiert, findet er, dass die xsd-Datei der Definition von spring.schemas entspricht. Aber eine Sache, die ich für den XML-Editor nicht verstehen kann: Wenn wir die schemaLocation definieren, wird sie beim Eingeben automatisch vervollständigt. Woher weiß sie das? Es verweist auch auf die Definition in den spring.schemas? Oder die xsd-Datei vom Remote-Server herunterladen? Wenn Sie die Datei vom Remote-Server herunterladen, dh wenn wir die Version nicht angeben, verweist sie auf die neueste Version.
Rocky Hu
Ein Fall kann auftreten, wenn die Datei vom Remote-Server heruntergeladen wird, sodass xsd immer die neueste Version ist. Wenn also ein Element in der neuesten Version definiert ist, aber nicht die Version, die unser Projekt verwendet hat (niedrigere Version), was passiert dann? Der XML-Prozessor lädt die xsd aus dem lokalen JAR und kann die Elementdefinition nicht erkennen.
Rocky Hu
Ich bin auf eine Situation gestoßen , in der Versionen mir ein HTTP 404 verursacht haben ... Ich meine, nach dem Entfernen von Versionen hat es gut funktioniert. Weißt du, warum ?
Bloomberg58
Ich kann nicht sicherstellen, dass Eclipse 09-2018 niemals Spring-Schemas aus dem Web abruft. Da Online- Spring IntegrationXSDs ohne URL-Version der alten Version 1.0 entsprechen, führt dies zu sporadischen Fehlermarkierungen in meinen XML-Dateien im Eclipse-Editor. Sehen Sie die important noteOnline-XSD hier: springframework.org/schema/integration/spring-integration.xsd oder hier: springframework.org/schema/integration/xml/…
Selaron
4

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.

Biju Kunjummen
quelle
1

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:

Geben Sie hier die Bildbeschreibung ein

Ohne die Versionen verursacht das value-separatorAttribut 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).

luis.espinal
quelle
Guter Punkt. Ich dachte das Gleiche, dass die deklarierte Konfiguration unter Berücksichtigung der niedrigeren Version bei höheren Versionen möglicherweise nicht funktioniert.
Ankit
1

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.

Shafqat Shafi
quelle
0

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.

Bakul Brahmbhatt
quelle
0

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.

Abhijith Madhav
quelle