Схема XML конфігурації Spring: з версією чи без?


75

Я новачок у Весні. Мене бентежить одне: інколи я бачу файли конфігурації XML із версійними схемами, а іноді з неверсійними. Наприклад, іноді я бачу щось подібне

<?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>

А іноді так:

<?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>

Зверніть увагу, що схеми spring-beansта spring-contextсхеми відрізняються у двох прикладах.

Отже, моє питання полягає в тому, який стиль ви б використали і чому? Зокрема, чи стане версійна схема недоступною в майбутньому, і чи неверсійна схема залишиться сумісною з поточним додатком, коли Spring оновить схему?

Побічне питання полягає в тому, де я можу знайти список версійних схем пружин?

Дуже дякую!


Відповіді:


96

Рекомендується використовувати XSD без версії, оскільки вони зіставляються з поточною версією фреймворку, який ви використовуєте у своєму додатку.

Програми та інструменти ніколи не повинні намагатися отримати ці XSD з Інтернету , оскільки ці схеми включені в JAR. Якщо вони це роблять, це, як правило, означає, що ваш додаток намагається використовувати XSD, найновіший, ніж фреймворк, яку ви використовуєте, або що ваш IDE / інструмент налаштовано неправильно.

Наскільки мені відомо, є лише один випадок, коли ви хотіли б використовувати конкретні версії XSD: при спробі використовувати атрибут XML, який було застарілим / зміненим в останній версії. Це, м’яко кажучи, трапляється не часто.

У будь-якому випадку команда Spring повинна відмовитись від версійних схем для Spring 5.0, див. SPR-13499 .

Детальніше про "безверсію == поточної версії":

Ці файли XSD включені до Spring JAR - "безверсійний" XSD відображається до останньої версії під час збірки (див. Файли spring.schemas, які фактично роблять це посилання). Крім того, файли, доступні в Інтернеті, будуються однаково (див. Ціль "schemaZip" у збірці gradle ).


Як ми знаємо, інформація в schemaLocation надається як "підказка" для процесора xml. Отже, коли процесор xml аналізує xml, він виявить, що файл xsd відповідає визначенню spring.schemas. Але одне, що я не можу зрозуміти, для редактора xml, якщо ми визначимо schemaLocation, він автоматично завершиться, коли ми введемо текст, так як він знає? Він також посилається на визначення навесні. Схеми? Або завантажити файл xsd з віддаленого сервера? Якщо завантажити файл з віддаленого сервера, це означає, що якщо ми не вказуємо версію, він посилається на останню версію.
Рокі Ху

Може статися один випадок, якщо він завантажує файл із віддаленого сервера, тому xsd завжди буде останньою версією, тож якщо елемент буде визначено в останній версії, але не у версії, яку використовував наш проект (нижча версія), що буде? Процесор xml завантажує xsd з локальної jar і не може розпізнати визначення елемента.
Рокі Ху

Я зіткнувся з ситуацією, коли версії викликали у мене HTTP 404 ... Я маю на увазі, після видалення версій він працював нормально. Ти знаєш чому ?
Bloomberg58,

Я не можу переконатись, що eclipse 09-2018 ніколи не завантажить схеми Spring з Інтернету. Оскільки онлайнові Spring IntegrationXSD-файли без версії в URL-адресі є старовинними версіями 1.0, це призводить до епізодичних маркерів помилок у моїх XML-файлах в редакторі Eclipse. Дивіться important noteв Інтернеті XSD тут: springframework.org/schema/integration/spring-integration.xsd або тут: springframework.org/schema/integration/xml/…
Селарон,

4

Я не впевнений, що вони є керівництвом, але я особисто віддаю перевагу посиланням на неверсійні схеми - загалом, якщо ви працюєте проти новіших версій проектів Spring (Spring core, інтеграція тощо), тоді ви можете зверніться до неверсійних схем.

Безверсійні схеми вказують на останню версію проектів, тому, можливо, вони не є правильною граматикою, якщо ви використовуєте справді стару версію Spring (скажімо, версію 2.5 проти поточно випущеної версії 4.0), у таких випадках це може бути краще вказувати на версійні схеми.

Ще один момент, який слід сказати тут, полягає в тому, що, якщо це можливо, краще взагалі уникати xml і перейти до стилю @Configuration на основі Java, щоб налаштувати ваші Spring Spring.


1

Я знаю, що питанню вже більше двох років, але я вважаю, що слід діяти обережно.

У моєму випадку я розробляв самостійний інструмент CLI, банку з банками. І коли мої задекларовані XSD не мали версій (sic), я помічав би дуже дивні помилки. Розглянемо такий фрагмент xml:

введіть тут опис зображення

Без версій value-separatorатрибут у заповнювачі властивості спричинить таку помилку:

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)

Можна спробувати побачити, що на землі витягується за допомогою транзитивних залежностей (навіть незважаючи на те, що ретельний огляд показав, що ми витягуємо правильні банки, що містять правильні xsds (і переконалися, що ми робили правильну властивість, зливаючись з плагіном тіні, коли ми будували uber -банки.)

Очевидно YMMV. Якщо це працює для одного проекту, тим краще. Але якщо ви коли-небудь починаєте бачити дивні помилки, які не піддаються поясненню, і у вас немає пропускної здатності, щоб переслідувати їх до першопричини, краще бути точним.

Контраргументом цього є те, що якщо ви коли-небудь змінюєте версію своїх весняних залежностей, вам потрібно переконатися, що явна версія xsd є правильною. У програмному забезпеченні все полягає в компромісах (і знанні того, у що ви потрапляєте, приймаючи рішення).


Влучне зауваження. Я думав те саме, що конфігурація, оголошена з урахуванням нижчої версії, може зламатися на старших версіях.
Ankit

1

Я записався на весняний курс на удеми. Я дотримувався кожного кроку, який мій інструктор показував мені робити. Отже, якщо ви використовуєте spring mvc і сплячий режим, ви можете зіткнутися з цією помилкою Не вдалося прочитати документ схеми ' http://www.springframework.org/schema/tx/spring-tx.xsd ' тощо для:

<mvc:annotation-driven/> and <tx:annotation-driven transaction-manager="myTransactionManager" /> elements

у моєму весняному конфігураційному файлі у мене були ці дві URL-адреси

    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

у xsi: schemaLocation, яку я замінив на

    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

насправді я відвідав ці два сайти http://www.springframework.org/schema/mvc/ та http://www.springframework.org/schema/tx/ і щойно додав останню версію spring-mvc та spring-tx, тобто , spring-mvc-4.2.xsd та spring-tx-4.2.xsd

Отже, на мій погляд, чітко вказувати версію no - це хороша практика. Сподіваюся, це допомагає. Дякую.


0

Ви знайдете файл META-INF / spring.schemas у своєму Jar. Цей файл визначає всі сумісні версії xsd. Якщо вказати URL-адресу без будь-якого номера версії, вона за замовчуванням буде сумісною з вашим файлом Jar. Оскільки у вас немає двох різних версій spring jar у classpath, у вашому додатку не буде помилок виконання.


0

Подумайте про використання безверсійних xsd. Це змусить інструмент підібрати версію xsd, яка відповідає версії Spring jar, яку ви використовуєте (подивіться на файл spring.schemas у вашій jar). У разі будь-якої несумісності під час оновлення ваших весняних бібліотек (що дійсно має бути рідкісним), ви повинні мати змогу ловити її під час збірки.

Це надасть можливість вирішити, чи потрібно вводити версію xsd для цього одного файлу чи насправді еволюціонувати від використання архаїчного та застарілого атрибута / елемента. Сподіваємось, це буде пізніше.

В іншому випадку ризик полягає у використанні можливого застарілого атрибута / елемента назавжди.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.