web-dev-qa-db-ja.com

spring-beans.xsdは「ローカル」を定義していません。どうして?

ほとんどすべてのSpringプロジェクトは、spring-beans.xsdを使用しています(より正確に言うと)。ただし、ファイル http://www.springframework.org/schema/beans/spring-beans.xsd を見ると、バージョン3.2であり、 「ローカル」属性の定義。

さらに興味深いのは http://www.springframework.org/schema/beans/spring-beans-3.2.xsd が実際に「ローカル」を定義していることです。

また、spring.schemaが原因でファイルがjar(org/springframework/beans/factory/xml/spring-beans-3.2.xsd)から取り出されているため、どのプロジェクトにもコンパイルやランタイムの問題はないと思います。

一方、Eclipseのxmlバリデーターは、インターネットリンクのみを使用し、xmlエラーを表示します。

"cvc-complex-type.3.2.2:属性 'local'は要素 'ref'に表示できません"

これはバグですか?

編集:要求ごとに、これは私の春のヘッダーです:

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

編集2:ここで私はローカルを使用しています

    <bean id="bar" 
    class="org.springframework.batch.item.support.CompositeItemWriter">
    <property name="delegates">
        <list>
            <ref local="foo" />
        </list>
    </property>
</bean>
<bean id="foo" class="Java.lang.String" />
20
user3183400

代わりに<ref bean="someBean"/>を使用してください。

34
tom

ここで述べたように: http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/

local 要素の ref 要素の属性は4.0ではサポートされなくなりましたBean xsdは、通常のBean参照よりも価値がなくなったためです。既存の ref local への参照を ref bean に変更するだけで、 4.0スキーマ。

ご存知かもしれませんが、Spring 3.xはJava 8と完全に互換性がないため、サポートされていない古いJava 7を使用するか、 SpringとJDKの両方をアップグレードします。最新のものを強くお勧めします

15
Marat Asadurian

http://www.springframework.org/schema/beans/spring-beans.xsd は実際には4.0 XSDを指しますが、local。さらに、問題の原因となる可能性があるSpring統合のEclipseにバグがあります。 INT-135

さらに、EclipseがクラスパスからXSDのロードを指定するための構成オプションが/ was /にありますが、これが機能するか、存在しないかは100%わかりません。そのスクリーンショットがあります: https://stackoverflow.com/a/2896051/1958771

~ sheenobu -> curl -s http://www.springframework.org/schema/beans/spring-beans.xsd | md5
0483a5565138fe9f79c5fbe38c7c5969
~ sheenobu -> curl -s http://www.springframework.org/schema/beans/spring-beans-3.2.xsd | md5
1562baeab9550e2149e9608dbb3bbadd
~ sheenobu -> curl -s http://www.springframework.org/schema/beans/spring-beans-4.0.xsd | md5
0483a5565138fe9f79c5fbe38c7c5969
3
Sheena Artrip

Spring(およびEclipse)は、xsdファイル内の宣言に関係なく、schemaLocationで宣言したjarを使用します。これは実際には、Springがそのすべての下で使用するXMLパーサーによって行われる検証です。

localref属性を使用する場合は、schemaLocation属性を持つスキーマを指すlocalを宣言する必要があります。これを行う場合、生成されたコンテキストは、Spring BeanDefinitionParserに存在するjarによって解析可能である必要があることに注意してください。

Xsi:schemaLocationで古い http://www.springframework.org/schema/beans/spring-beans-3.2.xsd を使用して問題を解決しました。 (私のプロジェクトも「古い」ので)

1
Jiri F.