2012-05-26 10 views
6

नोट: परीक्षण परियोजना मैं उल्लेख कर रहा हूँ के साथ डाउनलोड किया जा सकता:स्प्रिंग डी अनुप्रयोगकॉन्टेक्स्ट.एक्सएमएल एक्सएसआई वास्तव में कैसे है: स्कीमालोकेशन का उपयोग किया जाता है?

Git क्लोन https://github.com/mperdikeas/so-spring-di-appcontext-schemalocation.git

.. और 'चींटी रन' के साथ चलाते हैं।

मैं समझता हूं कि एक्सएमएल नेमस्पेस नामों का उपयोग अपारदर्शी पहचानकर्ताओं के रूप में किया जाता है और इसका उपयोग यूआरआई (wikipedia) के रूप में नहीं किया जाता है। मैं यह भी समझता हूं कि एक्सएमएल स्कीमा स्थान स्कीमा दस्तावेजों के वास्तविक स्थान के रूप में संकेत प्रदान करने के लिए हैं, और संकेतों में, अभ्यास में उपयोग नहीं किया जाता है (w3.org)। इस बात को ध्यान में रखते हुए मैं applicationContext.xml को संशोधित करके एक साधारण स्प्रिंग डी एप्लिकेशन (एक साधारण जे 2 एसई सेटिंग में उपयोग किया जाता है) के साथ प्रयोग कर रहा हूं। यहाँ शुरू करने संस्करण है:

<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"           
     xmlns:p   = "http://www.springframework.org/schema/p"             
     xsi:schemaLocation="http://www.springframework.org/schema/beans            
          http://www.springframework.org/schema/beans/spring-beans-2.5.xsd       
          http://www.springframework.org/schema/context            
         http://www.springframework.org/schema/context/spring-context-2.5.xsd">      

<context:component-scan base-package="atm"/>                  
<context:property-placeholder location="classpath:META-INF/spring/atm.properties"/>         

<bean id="soapTransport_" class="atm.SoapATMTransport" p:retries="${transport.retries}"/>       

जब मैंने किया था एक 'sudo ifconfig eth0 नीचे' परियोजना पूरी तरह से भाग गया जो क्रम schemaLocations से कुछ भी लाने के लिए परेशान कर रहा नहीं के अनुरूप है।

[java] org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 10 in XML document from class path resource [META-INF/spring/applicationContext.xml] is invalid; nested exception is org.xml.sax.SAXParseException; lineNumber: 10; columnNumber: 100; cvc-elt.1: Cannot find the declaration of element 'beans'. 
[java]  at org.apache.tools.ant.taskdefs.ExecuteJava.execute(ExecuteJava.java:194) 
[java]  at org.apache.tools.ant.taskdefs.Java.run(Java.java:771) 
[java]  at org.apache.tools.ant.taskdefs.Java.executeJava(Java.java:221) 
[java]  at org.apache.tools.ant.taskdefs.Java.executeJava(Java.java:135) 
[java]  at org.apache.tools.ant.taskdefs.Java.execute(Java.java:108) 
[java]  at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
[java]  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
[java]  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
[java]  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
[java]  at java.lang.reflect.Method.invoke(Method.java:601) 
[java]  at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
[java]  at org.apache.tools.ant.Task.perform(Task.java:348) 
[java]  at org.apache.tools.ant.Target.execute(Target.java:390) 
[java]  at org.apache.tools.ant.Target.performTasks(Target.java:411) 
[java]  at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399) 
[java]  at org.apache.tools.ant.Project.executeTarget(Project.java:1368) 
[java]  at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41) 
[java]  at org.apache.tools.ant.Project.executeTargets(Project.java:1251) 
[java]  at org.apache.tools.ant.Main.runBuild(Main.java:809) 
[java]  at org.apache.tools.ant.Main.startAnt(Main.java:217) 
[java]  at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280) 
[java]  at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109) 

कौन सा है कि वसंत डि क्रम xsi में प्रत्येक जोड़ी में दूसरी URL का उपयोग करता सुझाव है कि लगता है: हालांकि, जब मैं प्रत्येक जोड़ी में दूसरी यूआरएल के लिए एक सरल अंडरस्कोर जोड़कर schemaLocations घायल मैं निम्नलिखित शिकायत मिली : किसी प्रकार के पहचानकर्ता के रूप में स्कीमालोकेशन (इसके तर्क में हार्डकोडेड क्योंकि नेटवर्क एक्सेस नहीं है)। तो मेरी धारणा यह होगा कि वसंत डि क्रम प्रत्येक नाम स्थान के लिए पहचानकर्ता के दो प्रकार का उपयोग करता है: xmlns पहचानकर्ता विशिष्ट नाम स्थान (एक अपारदर्शी स्ट्रिंग के रूप में प्रयोग किया जाता है) और schemaLocation पहचानकर्ता विशिष्ट है कि के लिए स्कीमा संस्करण की पहचान करने की पहचान के लिए नेमस्पेस (फिर से एक अपारदर्शी स्ट्रिंग के रूप में उपयोग किया जाता है)। अर्थात। स्कीमालोकेशन वास्तव में नामस्थान के संस्करण के लिए (एक विपरीत तरीके से उपयोग किया जाता है? क्योंकि यह डब्ल्यू 3 सी दस्तावेजों का इरादा नहीं लगता है)। इसके अलावा, इस तरह के मामले में, स्प्रिंग डी रनटाइम स्कीमालोकेशन की कमी के बारे में शिकायत क्यों करता है "पी" नामस्थान। क्या मेरा मानसिक मॉडल सही है?

उत्तर

10

यह इस प्रकार होता है:

  • XML स्कीमा आप XML नामस्थान के उपनाम (लघु नाम) को परिभाषित करने की अनुमति देता है। तकनीकी रूप से सभी नामस्थानों को पूर्ण यूआरआई द्वारा पहचाना जाता है लेकिन यह बहुत बोझिल होगा - इसलिए आप context और p जैसे लघु उपनामों का उपयोग कर सकते हैं। xmlns विशेषता

  • डिफ़ॉल्ट रूप से एक्सएमएल पार्सर्स नामस्थान मानते हैं यूआरआई एक एक्सएसडी फ़ाइल यूआरएल स्थान भी है। यह अक्सर मामला है, लेकिन spec द्वारा आवश्यक नहीं है। यह भी है कि यदि आप schemaLocation विशेषता प्रदान नहीं करते हैं तो वसंत में एक्सएमएल पार्सर काम करता है।

  • schemaLocation नामस्थान यूआरआई से एक्सएसडी फ़ाइल भौतिक स्थान (यूआरएल) से मानचित्र करने के लिए उपयोग किया जाता है। इसका उपयोग तब किया जाता है जब स्कीमा नेमस्पेस मान्य XSD URL पर इंगित करता है (MSDN on schemaLocation देखें)।

  • अंतिम लेकिन कम से कम नहीं, वसंत अभी तक एक और परत जोड़ता है जो इंटरनेट URL को क्लासस्पैट पर स्थानीय फ़ाइलों में अनुवाद करता है।इस प्रकार आपका एप्लिकेशन इंटरनेट कनेक्शन के बिना शुरू हो सकता है (या जब springframework.org साइट डाउन हो)।

आप अपने प्रोजेक्ट पुस्तकालयों खोज यदि आप spring.schemas नामित कई फ़ाइलों मिल जाएगा। इन फ़ाइलों (, मैं संरेखण जोड़ा फ़ाइल spring-context.jar में पाया से उद्धरण) नीचे के समान पंक्तियाँ हो:

http\://www.springframework.org/schema/context/spring-context.xsd= org/springframework/context/config/spring-context-3.1.xsd 
http\://www.springframework.org/schema/jee/spring-jee.xsd=   org/springframework/ejb/config/spring-jee-3.1.xsd 
http\://www.springframework.org/schema/lang/spring-lang.xsd=  org/springframework/scripting/config/spring-lang-3.1.xsd 
http\://www.springframework.org/schema/cache/spring-cache.xsd=  org/springframework/cache/config/spring-cache-3.1.xsd 
+0

धन्यवाद, कि एक स्पष्ट मॉडल है। दो अतिरिक्त प्रश्न यदि मैं कर सकता हूं: [1] मेरे प्रोजेक्ट के पुस्तकालयों में केवल एक spring.chemas फ़ाइल (spring.jar में) है और इसमें एक मैपिंग शामिल नहीं है जैसे कि आप 'xsi' के लिए वर्णन करते हैं और 'पी' नेमस्पेस (हालांकि मुझे 'संदर्भ' और रूट नेमस्पेस मैपिंग मिल सकती है), [2] उस मैपिंग चीज़ को कहां दस्तावेज किया गया है? –

+0

@MenelaosPerdikeas: दुर्भाग्य से मैं दोनों [1] और [2] के उत्तरों को नहीं जानता। –

संबंधित मुद्दे