1. ホーム
  2. Java

Springの設定でxsdファイルのバージョン番号を設定しない方が良い理由

2022-02-10 08:35:42

なぜダボは問題なく起動するのですか?

このブログは、次のような問いかけから生まれました。

弊社はアリさんのダボを作っていますが、アリさんのオープンソースサイト http://code.alibabatech.com は何ヶ月もハングアップしているのに、なぜ弊社のアプリケーションは問題なく起動するのでしょうか?

私たちのアプリケーションのSpring設定ファイルには、同様の設定があります。

<?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:dubbo="http://code.alibabatech.com/schema/dubbo"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	        http://www.springframework.org/schema/beans/spring-beans.xsd
	        http://code.alibabatech.com/schema/dubbo
	        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

Springが起動時にXMLファイルをチェックしていることは周知の事実です。あるいは、なぜEclipseにxmlのエラーメッセージがないのでしょうか?

例えば、こんなSpringの設定。

<?xml version="1.0" encoding="UTF-8"? >
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd& quot;>
</beans>

また、バージョン番号を付加することもできる。

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0. xsd">

このバージョン番号があるのとないのでは、何が違うのでしょうか?

XMLのいくつかの概念

まず、xmlのいくつかの概念から見ていきましょう。

xmlのスキーマには名前空間があり、その名前空間には別名を付けることができる。例えば、springの共通名前空間。

	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:context="http://www.springframework.org/schema/context"

通常、名前空間はXSDが格納されているアドレスであるURIに対応するが、仕様ではこれを要求していない。schemaLocationが提供されない場合、SpringのXMLパーサーは名前空間のURIからXSDファイルをロードする。設定ファイルをこのように変更すれば、問題なく動作します。

<?xml version="1.0" encoding="UTF-8"? >
<beans xmlns="http://www.springframework.org/schema/beans/spring-beans.xsd"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

schemaLocationはxmlの名前空間と対応するXSDファイルの対応を提供するので,xsi:schemaLocationの後に設定される文字列は,名前空間のURIが前にあり,xsdファイルのURIが後にある,対になっていることがわかる.

	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans.xsd
	http://www.springframework.org/schema/security
	http://www.springframework.org/schema/security/spring-security.xsd"

SpringがXMLを検証する方法

Springはデフォルトでは起動時にXSDファイルを読み込んでxmlファイルの検証を行うため、インターネットがダウンした時や、オープンソースのソフトウェアがドメインを切り替えた時などに、起動しないアプリケーションに遭遇することがあります。OracleがSunを買収したとき、このような状況に陥ったのを覚えています。

これを防ぐために、SpringはデフォルトでローカルからXSDファイルを読み込む仕組みを提供しています。spring-context-3.2.0.RELEASE.jarを開くと、中に2つの特殊なファイルがあることがわかる。

spring.handlers

http\://www.springframework.org/schema/context=org.springframework.context.config.ContextNamespaceHandler
http\://www.springframework.org/schema/jee=org.springframework.ejb.config.JeeNamespaceHandler
http\://www.springframework.org/schema/lang=org.springframework.scripting.config.LangNamespaceHandler
http\://www.springframework.org/schema/task=org.springframework.scheduling.config.TaskNamespaceHandler
http\://www.springframework.org/schema/cache=org.springframework.cache.config.CacheNamespaceHandler

spring.schemas

http\://www.springframework.org/schema/context/spring-context-2.5.xsd=org/springframework/context/config/spring-context-2.5.xsd
http\://www.springframework.org/schema/context/spring-context-3.0.xsd=org/springframework/context/config/spring-context-3.0.xsd
http\://www.springframework.org/schema/context/spring-context-3.1.xsd=org/springframework/context/config/spring-context-3.1.xsd
http\://www.springframework.org/schema/context/spring-context-3.2.xsd=org/springframework/context/config/spring-context-3.2.xsd
http\://www.springframework.org/schema/context/spring-context.xsd=org/springframework/context/config/spring-context-3.2.xsd
...

次に、jarパッケージ内のorg/springframework/context/config/ディレクトリを開くと、以下のように表示されます。

spring-context-2.5.xsd
春コン3.0.xsd
Spring-context-3.1.xsd
Spring-context-3.2.xsd

明らかに、SpringはXSDファイルをローカルに置き、spring.schemasでマッピングを行い、ローカルから優先的にXSDファイルを読み込むと考えることができます。

そして、Springは親切にも、古いバージョンのXSDファイルもすべて置いておいてくれました。これによって、Springのバージョンをアップグレードして、設定ファイルに古いXSDファイルがあると、接続が切れたときにアプリケーションが起動しなくなるのを防ぐことができます。

また、バージョン番号が設定されていない場合、現在のバージョンの XSD ファイルが使用されることもわかります。

http\://www.springframework.org/schema/context/spring-context.xsd=org/springframework/context/config/spring-context-3.2.xsd

同様に、dubboのjarパッケージを開くと、そのspring.schemasファイルに次のような設定があることがわかります。

http\://code.alibabatech.com/schema/dubbo/dubbo.xsd=META-INF/dubbo.xsd

つまり、Spring は dubbo をロードする際に dubbo jar から dubbo.xsd をロードするのです。

SpringのXMLチェックサムをスキップするには?

チェックサムは、以下の方法でスキップすることができます。

GenericXmlApplicationContext context = new GenericXmlApplicationContext();
context.setValidating(false);

自作のspring xml名前空間拡張の書き方

Springのドキュメントを参照するといいのですが、実はとても簡単です。自分でNamespaceHandlerを実装して、spring.handlersとspring.schemasを設定すればOKです。

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/extensible-xml.html

その他のもの

XSDの読み込みに失敗しないための一工夫

http://hellojava.info/?p=135

Springの名前空間の完全なリスト

http://stackoverflow.com/questions/11174286/spring-xml-namespaces-how-do-i-find-what-are-the-implementing-classes-behind-t

スプリングコア

春のセキュリティ

Springとの連携

概要

Springの設定でXSDのバージョン番号を設定しないのはなぜですか?
なぜなら、バージョン番号が設定されていない場合、現在の jar にある XSD ファイルが取得されるため、あらゆるリスクが軽減されるからです。
そして、これは設定以上のことに合意するためのエレガントな方法です。

参考

http://stackoverflow.com/questions/10768873/spring-di-applicationcontext-xml-how-exactly-is-xsischemalocation-used

http://stackoverflow.com/questions/11174286/spring-xml-namespaces-how-do-i-find-what-are-the-implementing-classes-behind-t

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/extensible-xml.html

公共

パブリックナンバーへようこそ。Java、Spring Boot、Arthas、Dubboの共有を中心とした、Cross Cloud Broken Ridgeのコラムです。