Spring schemaLocation ล้มเหลวเมื่อไม่มีการเชื่อมต่ออินเทอร์เน็ต


107

ฉันใช้ Spring และapplication-context.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:util="http://www.springframework.org/schema/util"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:aop="http://www.springframework.org/schema/aop"
   xmlns:tx="http://www.springframework.org/schema/tx"
   xmlns:p="http://www.springframework.org/schema/p"
   xmlns:security="http://www.springframework.org/schema/security"
   xsi:schemaLocation="
   http://www.springframework.org/schema/beans 
   http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
   http://www.springframework.org/schema/util 
   http://www.springframework.org/schema/util/spring-util-2.0.xsd
   http://www.springframework.org/schema/context
   http://www.springframework.org/schema/context/spring-context-2.1.xsd
   http://www.springframework.org/schema/tx
   http://www.springframework.org/schema/tx/spring-tx.xsd
   http://www.springframework.org/schema/aop
   http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
   http://www.springframework.org/schema/security
   http://www.springframework.org/schema/security/spring-security-2.0.xsd"
   >

.....

เมื่อการเชื่อมต่ออินเทอร์เน็ตของฉันขาดหายฉันไม่สามารถเรียกใช้แอปพลิเคชันผ่านแมวตัวผู้หรือท่าเทียบเรือได้

ให้:

[main] WARN  org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Ignored XML validation warning
org.xml.sax.SAXParseException: schema_reference.4: Failed to read schema document '/spring-beans-2.0.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.warning(ErrorHandlerWrapper.java:96)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:380)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:318)
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.reportSchemaErr(XSDHandler.java:2541)
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.reportSchemaWarning(XSDHandler.java:2532)
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.getSchemaDocument(XSDHandler.java:1836)
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.parseSchema(XSDHandler.java:531)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadSchema(XMLSchemaLoader.java:552)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.findSchemaGrammar(XMLSchemaValidator.java:2408)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleStartElement(XMLSchemaValidator.java:1753)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.startElement(XMLSchemaValidator.java:685)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:400)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:626)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3095)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:921)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107)
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:225)
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:283)
    at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:75)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:396)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:342)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:310)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:143)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:178)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149)
    at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:124)
    at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:92)
    at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:123)
    at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:423)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:353)
    at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
    at org.mortbay.jetty.handler.ContextHandler.startContext(ContextHandler.java:548)
    at org.mortbay.jetty.servlet.Context.startContext(Context.java:136)
    at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
    at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
    at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
    at org.mortbay.jetty.plugin.Jetty6PluginWebAppContext.doStart(Jetty6PluginWebAppContext.java:115)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.handler.HandlerCollection.doStart(HandlerCollection.java:152)
    at org.mortbay.jetty.handler.ContextHandlerCollection.doStart(ContextHandlerCollection.java:156)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.handler.HandlerCollection.doStart(HandlerCollection.java:152)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
    at org.mortbay.jetty.Server.doStart(Server.java:224)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.plugin.Jetty6PluginServer.start(Jetty6PluginServer.java:132)
    at org.mortbay.jetty.plugin.AbstractJettyMojo.startJetty(AbstractJettyMojo.java:441)
    at org.mortbay.jetty.plugin.AbstractJettyMojo.execute(AbstractJettyMojo.java:383)
    at org.mortbay.jetty.plugin.AbstractJettyRunMojo.execute(AbstractJettyRunMojo.java:210)
    at org.mortbay.jetty.plugin.Jetty6RunMojo.execute(Jetty6RunMojo.java:184)
    at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:483)
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:678)
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeStandaloneGoal(DefaultLifecycleExecutor.java:553)
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:523)
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:371)
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:332)
    at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:181)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:356)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:137)
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:356)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315)
    at org.codehaus.classworlds.Launcher.launch(Launcher.java:255)
    at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430)
    at org.codehaus.classworlds.Launcher.main(Launcher.java:375)
2009-11-13 15:31:25,675 [main] ERROR org.springframework.web.context.ContextLoader - Context initialization failed
org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 23 in XML document from class path resource [application-context.xml] is invalid; nested exception is org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'beans'.
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:404)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:342)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinit........

มีข้อเสนอแนะวิธีแก้ไขอย่างไร

คำตอบ:


115

ไม่จำเป็นต้องใช้ classpath: protocol ใน schemaLocation URL ของคุณหากกำหนดค่า namespace อย่างถูกต้องและไฟล์ XSD อยู่บน classpath ของคุณ

Spring doc "การลงทะเบียนตัวจัดการและสคีมา " จะแสดงวิธีการดำเนินการ

ในกรณีของคุณปัญหาน่าจะเป็นที่สปริงบริบทบนคลาสพา ธ ของคุณไม่ใช่ 2.1 นั่นคือเหตุผลที่เปลี่ยนโปรโตคอลเป็น classpath: และการใส่ 2.1 XSD เฉพาะใน classpath ของคุณช่วยแก้ปัญหาได้

จากสิ่งที่ฉันเห็นมี 2 schema ที่กำหนดไว้สำหรับ XSD หลักที่มีอยู่ในขวดสปริง - * หนึ่งครั้งในการแก้ไข URL ของสคีมาด้วยเวอร์ชันและหนึ่งครั้งโดยไม่มี

ดังตัวอย่างให้ดูส่วนนี้ของเนื้อหา spring.schemas ใน spring-context-3.0.5.RELEASE.jar:

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.xsd=org/springframework/context/config/spring-context-3.0.xsd

ซึ่งหมายความว่า (ใน xsi: schemaLocation)

http://www.springframework.org/schema/context/spring-context-2.5.xsd 

จะถูกตรวจสอบเทียบกับ

org/springframework/context/config/spring-context-2.5.xsd 

ใน classpath

http://www.springframework.org/schema/context/spring-context-3.0.xsd 

หรือ

http://www.springframework.org/schema/context/spring-context.xsd

จะถูกตรวจสอบเทียบกับ

org/springframework/context/config/spring-context-3.0.xsd 

ใน classpath

http://www.springframework.org/schema/context/spring-context-2.1.xsd

ไม่ได้กำหนดไว้ดังนั้น Spring จะค้นหาโดยใช้ URL ตามตัวอักษรที่กำหนดใน schemaLocation


37
สำหรับผู้ที่ต้องการข้อมูลสรุป: Spring ไม่พบ schemas ใน classpath Spring core JAR มีการแม็ป schema-> filename ที่รวมอยู่ใน JAR หากไม่สามารถแก้ไขได้จะไปที่เว็บ
Alex

ฉันได้ประกาศไว้เช่นนี้ "http:////www.springframework.org/schema/context http: ///www.springframework.org/schema/context/spring-context-4.0.xsd" ฉันมีโถ 4.0 ใน Glassfish / domains / domain1 / lib เมื่อใดก็ตามที่ฉันปรับใช้โครงการ glassfish อ้างถึงอินเทอร์เน็ต ปัญหานี้เฉพาะสำหรับ glassfish-4.0 หรือไม่ (เพิ่ม '/' เพิ่มเติมสำหรับการจัดรูปแบบ)
Pragalathan M

ฉันคิดว่าลิงก์ "การลงทะเบียนตัวจัดการและสคีมา" ใหม่ควรอยู่ที่นี่: docs.spring.io/spring/docs/current/spring-framework-reference/…
Dirk

1
@Dirk - ลิงค์นั้นดูเหมือนจะเสีย
Stormcloud

2
@Stormcloud ใช่ลิงก์เดิมดูเหมือนจะกลับมาและลิงก์ที่ฉันแนะนำเสีย นี่คือลิงค์เอกสารล่าสุด: docs.spring.io/spring/docs/current/spring-framework-reference/…
Dirk

28

ฉันแก้ไขมัน

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:security="http://www.springframework.org/schema/security"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
       http://www.springframework.org/schema/util 
       http://www.springframework.org/schema/util/spring-util-2.0.xsd
       http://www.springframework.org/schema/context
       classpath:spring-context-2.1.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
       http://www.springframework.org/schema/security
       http://www.springframework.org/schema/security/spring-security-2.0.xsd"
       >

classpath:spring-context-2.1.xsdเป็นกุญแจสำคัญสำหรับการทำงานในโหมดออฟไลน์ (ไม่มีการเชื่อมต่ออินเทอร์เน็ต) นอกจากนี้ฉันยังคัดลอกspring-context-2.1.xsdใกล้ (ไดเร็กทอรีเดียวกัน) ไฟล์ application-context.xml


6
สำหรับผู้ใช้ intellij ที่อาจพบปัญหานี้ สิ่งนี้ใช้ได้แม้ว่า intellij จะไม่รู้จักไวยากรณ์ classpath ภายใน schemalLocation และเน้นว่าเป็นข้อผิดพลาด
Upgradingdave

ขอบคุณมาก @DaveParoulek - ข้อผิดพลาดทำให้ฉันผิดหวัง แต่นี่เป็นเคล็ดลับอย่างแน่นอน
Zach Johnson

18

สิ่งนี้ใช้ได้ผลสำหรับฉัน

xsi:schemaLocation=
"http://www.springframework.org/schema/beans 
             classpath:org/springframework/beans/factory/xml/spring-beans-3.0.xsd
http://www.springframework.org/schema/context 
             classpath:org/springframework/beans/factory/xml/spring-context-3.0.xsd"

1
ใช่สิ่งนี้ใช้ได้เพราะ xsd บรรจุอยู่ในโถสปริง ดังนั้นไม่จำเป็นต้องตรวจสอบใน springframework.com เมื่อคุณสามารถใช้ xsd ในขวดได้ :)
Somaiah Kumbera

วิธีนี้ใช้ได้ผลสำหรับฉันเพราะฉันมีสปริงขึ้นอยู่ในโถฉันหมายถึงเป็นโถภายนอกและไม่มีอินเทอร์เน็ตล้มเหลวโซลูชันของคุณทำงานได้ดีมากสำหรับฉันขอบคุณพระเจ้าอวยพรมาก
chiperortiz

@godlikeNoob ฉันลองแล้ว แต่มันให้ข้อผิดพลาดอีกครั้ง "cvc-elt.1: ไม่พบการประกาศขององค์ประกอบ 'beans'
Kamini

6

ในกรณีที่มีใครมาถึงที่นี่ผ่านรูทเดียวกับที่ฉันทำ - ฉันประสบปัญหานี้เพราะฉันกำลังสร้าง JAR เดียวที่มีการอ้างอิงทั้งหมดรวมถึง Spring JAR ด้วย เป็นผลให้ไฟล์spring.schemasในMETA-INFบางไฟล์ของ Spring JARs ถูกเขียนทับ

ฉันพบวิธีแก้ปัญหาที่แนะนำที่นี่: จะสร้างขวดปฏิบัติการที่ใช้สปริงด้วย maven ได้อย่างไร


5

พบปัญหาที่คล้ายกันในวันนี้ ในกรณีของฉันมันเป็นปลั๊กอินสีที่เป็นตัวการนอกเหนือจาก springframework.org ที่มีการหยุดทำงาน ข้อมูลโค้ดต่อไปนี้ช่วยล้างสิ่งต่างๆ:

<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
   <resource>META-INF/spring.schemas</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
    <resource>META-INF/spring.handlers</resource>
</transformer>

HTH คน


ข้อมูลโค้ดด้านบนต้องเพิ่มที่ไหน
Kamini

4

คุณควรตรวจสอบว่าไฟล์spring.handlersและspring.schemasไฟล์อยู่ใน classpath และมีเนื้อหาที่ถูกต้อง

ซึ่งสามารถทำได้ด้วยClassLoader.getResource(..). คุณสามารถรันเมธอดด้วยรีโมตดีบักเกอร์ในสภาพแวดล้อมรันไทม์ การตั้งค่าการเขียน XML ที่ขยายได้อธิบายไว้ในSpring Reference B.5 การลงทะเบียนตัวจัดการและสคีมาการลงทะเบียนและการจัดการสคีมา

โดยปกติไฟล์ควรอยู่ในขวดสปริง (springframework.jar / META-INF /) และบน classpath เมื่อสามารถเริ่ม Spring ได้


1
สวัสดีโซลูชันของคุณซับซ้อนมาก ฉันไม่เข้าใจว่าคุณหมายถึงอะไร? jroller.com/marshbourdon/entry/using_spring_2_x_xmlฉันลองแล้ว แต่ไม่ได้ผล ข้อเสนอแนะใด ๆ ? การทำงานกับเว็บแอปในขณะที่ไม่มีการเชื่อมต่ออินเทอร์เน็ตเป็นเรื่องที่ซับซ้อน ฉันถูกไหม ? ขอบคุณ.
Altug

1
สปริงควรทำงานนอกกรอบ มีบางอย่างใน classpath ของคุณไม่ถูกต้อง คำตอบของฉันมีเพียงคำแนะนำบางประการในการวิเคราะห์ปัญหาของคุณ
Thomas Jung

2

ค้นหาเส้นทางชั้นเรียน

หากคุณใช้ eclipse ให้คลิกที่ไฟล์ jar ที่เกี่ยวข้อง ไปที่ -> META-INF-> เปิดไฟล์ spring.schemas

คุณจะเห็นเส้นดังต่อไปนี้

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

คัดลอกหลัง = และกำหนดค่าถั่วตามด้านล่าง

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util" xmlns:rabbit="http://www.springframework.org/schema/rabbit" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/rabbit classpath:org/springframework/amqp/rabbit/config/spring-rabbit-1.1.xsd http://www.springframework.org/schema/beans classpath:org/springframework/beans/factory/xml/spring-beans-3.1.xsd http://www.springframework.org/schema/context classpath:org/springframework/context/config/spring-context-3.1.xsd http://www.springframework.org/schema/util classpath:org/springframework/beans/factory/xml/spring-util-3.1.xsd">


ฉันทำการเปลี่ยนแปลงนี้ใน xml springframework.org/schema/rabbit classpath: org / springframework / amqp / rabbit / config / spring-rabbit-1.6.xsdแต่มันบอกว่าล้มเหลวในการอ่านเอกสาร schema 'classpath: org / springframework / amqp / กระต่าย / config / spring-rabbit-1.6.xsd '? ข้อเสนอแนะใด ๆ
Lalit Mehra

1

คุณต้องเพิ่มตำแหน่งสคีมาในนิยาม bean ของคุณจากนั้นจะพบได้ใน classpath แทนที่จะดึงข้อมูลผ่านเน็ต จากปัญหาการจัดรูปแบบของคุณฉันไม่แน่ใจ 100% ว่าคุณไม่ได้ทำสิ่งนี้แล้ว

<?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-2.0.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<!-- empty: the beans we use are in the base class's context. -->
</beans>

1

เราแก้ไขปัญหาในการดำเนินการนี้:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
factory.setValidating(false); // This avoid to search schema online
factory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema");
factory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaSource", "TransactionMessage_v1.0.xsd");

โปรดทราบว่าแอปพลิเคชันของเราเป็นแอปออฟไลน์แบบสแตนด์อโลนของ Java


1

หากคุณกำลังใช้ eclipse สำหรับการพัฒนาของคุณจะช่วยได้ถ้าคุณติดตั้งปลั๊กอิน STS สำหรับ Eclipse [จาก marketPlace สำหรับ eclipse เวอร์ชันเฉพาะ

ตอนนี้เมื่อคุณพยายามสร้างไฟล์การกำหนดค่าใหม่ในโฟลเดอร์ (ตามปกติคือทรัพยากร) ภายในโปรเจ็กต์ตัวเลือกจะมี "Spring Folder" และคุณสามารถเลือกตัวเลือก "Spring Bean Definition File" Spring> Spring Bean Configuation File

เมื่อเลือกตัวเลือกนี้เมื่อคุณทำตามขั้นตอนระบบจะขอให้คุณเลือกสำหรับเนมสเปซและเวอร์ชันเฉพาะ:

ดังนั้นความเป็นไปได้ที่จะมีโถที่ไม่มีอยู่จริงหรือเวอร์ชันเก่าก็สามารถกำจัดได้

คงจะโพสรูปเหมือนกัน แต่ชื่อเสียงไม่ค่อยดี .. :(


1

ฉันต้องการเพิ่มแง่มุมเพิ่มเติมของการสนทนานี้ ใน windows OS ฉันสังเกตเห็นว่าเมื่อไฟล์ jar ที่มี schema ถูกเก็บไว้ในไดเร็กทอรีที่มีพา ธ มีอักขระช่องว่างเช่นในตัวอย่างต่อไปนี้

"c:\Program Files\myApp\spring-beans-4.0.2.RELEASE.jar"

จากนั้นการระบุ URL ตำแหน่งของสคีมาด้วยวิธีต่อไปนี้ไม่เพียงพอเมื่อคุณกำลังพัฒนาแอปพลิเคชันแบบสแตนด์อโลนที่ควรทำงานแบบออฟไลน์ด้วย

<beans
 xsi:schemaLocation="
   http://www.springframework.org/schema/beans org/springframework/beans/factory/xml/spring-beans-2.0.xsd"
    />

ฉันได้เรียนรู้ว่าผลลัพธ์ของการแก้ปัญหา URL ตำแหน่งสคีมานั้นเป็นไฟล์ที่มีเส้นทางดังต่อไปนี้

"c:\Program%20Files\myApp\spring-beans-4.0.2.RELEASE.jar"

เมื่อฉันเริ่มแอปพลิเคชันของฉันจากไดเร็กทอรีอื่นซึ่งไม่มีอักขระช่องว่างบนพา ธ การแก้ปัญหาตำแหน่งสคีมาก็ใช้ได้ดี อาจมีใครประสบปัญหาคล้าย ๆ กัน? อย่างไรก็ตามฉันพบว่าโปรโตคอล classpath ทำงานได้ดีในกรณีของฉัน

<beans
 xsi:schemaLocation="
   http://www.springframework.org/schema/beans classpath:org/springframework/beans/factory/xml/spring-beans-2.0.xsd"
    />

1

ปัญหาอยู่ในไฟล์ JAR ที่คุณใช้ในแอปพลิเคชันของคุณ

สิ่งที่ฉันทำซึ่งได้ผลคือเข้าไปใน JARs สำหรับ SPRING-CORE, SPRING-BEANS, SPRING-CONTEXT, SPRING-TX ที่ตรงกับเวอร์ชันที่ฉันใช้ ภายในโฟลเดอร์ META-INF ฉันเชื่อมต่อ spring.handlers และ spring.schemas ทั้งหมดที่อยู่ใน JARs เหล่านั้นเข้าด้วยกัน

ฉันฆ่านกสองตัวด้วยหินก้อนเดียวฉันแก้ปัญหาของสคีมาเพื่อให้มันทำงานได้อย่างถูกต้องในโหมดออฟไลน์

ปล. ฉันลองใช้ปลั๊กอิน maven สำหรับ SHADE และหม้อแปลง แต่ไม่ได้ผล


คุณแก้ปัญหานี้ได้อย่างไรโปรดช่วยฉันให้เข้าใจ ฉันต้องการ
Kamini

1

ฉันมีปัญหานี้ สำหรับลูกหลานข้อยกเว้นของฉันคือ:

org.xml.sax.SAXParseException; lineNumber: 7; columnNumber: 117;
schema_reference.4: Failed to read schema document
'http://www.springframework.org/schema/beans/spring-beans-4.2.xsd'

ฉันแก้ไขได้เมื่อฉันรู้ว่าเวอร์ชันที่spring-beansระบุใน Maven ของฉันpom.xmlคือ4.1.xดังนั้นจึงหมายถึงเฉพาะ.xsdไม่พบใน classpath

สิ่งนี้ถูกปิดบังไว้เป็นเวลานานเนื่องจากปกติฉันออนไลน์อยู่ดังนั้นฉันจึงคิดว่าการออฟไลน์ทำให้งานสร้าง "เสีย" แต่จริงๆแล้วมันไม่มีอะไรเกี่ยวข้องกับมัน การอัปเดตของฉันpom.xmlเพื่อระบุเวอร์ชันที่ถูกต้องspring-beansกล่าวคือ4.2.xแก้ไขแล้ว


1

ฉันมีปัญหาเดียวกันเมื่อใช้ spring-context เวอร์ชัน 4.0.6 และ spring-security เวอร์ชัน 4.1.0

เมื่อเปลี่ยนเวอร์ชัน spring-security เป็น 4.0.4 (เนื่องจากไม่มี 4.0.6 ของ spring-security) ใน pom และ security xml ของฉัน -> schemaLocation จะถูกคอมไพล์โดยไม่ใช้อินเทอร์เน็ต

นั่นหมายความว่าคุณสามารถแก้ปัญหานี้ได้โดย:

  • การเปลี่ยนการรักษาความปลอดภัยสปริงเป็นเวอร์ชันเก่าหรือรุ่นเดียวกันกับสปริงบริบท

  • การเปลี่ยนบริบทฤดูใบไม้ผลิเป็นเวอร์ชันที่ใหม่กว่าหรือเดียวกันกับการรักษาความปลอดภัยแบบสปริง

(วิธีใดก็ตามที่บริบทสปริงจะใหม่กว่าหรือเวอร์ชันเดียวกันกับ spring-security)


0

ฉันเคยประสบปัญหาที่คล้ายกันนี้เช่นกัน ในกรณีของฉันความละเอียดของฉันค่อนข้างแตกต่างกัน นี่คือไฟล์ xml บริบทฤดูใบไม้ผลิของฉัน:

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

ฉันไม่ได้ระบุเวอร์ชัน xsd ใด ๆ เนื่องจากฉันต้องการให้สปริงใช้เวอร์ชัน xsd ล่าสุดภายในการอ้างอิงสปริง เวอร์ชันฤดูใบไม้ผลิที่แอปพลิเคชันของฉันใช้คือspring-beans-4.3.1.RELEASE.jar: 4.3.1.RELEASEและเมื่อฉันประกอบแอปพลิเคชันลงในโถการพึ่งพาสปริงทั้งหมดจะมีอยู่ในพา ธ คลาสของฉัน อย่างไรก็ตามฉันได้รับข้อผิดพลาดต่อไปนี้ระหว่างการเริ่มต้นบริบทแอปพลิเคชัน Spring ของฉัน:

org.xml.sax.SAXParseException: schema_reference.4: Failed to read schema document 'http://www.springframework.org/schema/beans/spring-beans.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.

หลังจากแก้ไขปัญหาอย่างยากลำบากฉันพบว่าปัญหาเกิดจากindex.listภายในโฟลเดอร์ META-INF ของไฟล์ jar ของฉัน ด้วยไฟล์index.list ตัวจัดการ spring namespace ไม่สามารถระบุได้เพื่อแยกวิเคราะห์ xml บริบทแอ็พพลิเคชัน spring อย่างถูกต้อง คุณสามารถอ่านเพิ่มเติมเกี่ยวกับSPR-5705ฉบับฤดูใบไม้ผลินี้

การลบการสร้างดัชนีออกจากปลั๊กอิน maven-jar-plugin ของฉันทำให้ฉันสามารถแก้ไขปัญหาได้ หวังว่านี่จะช่วยประหยัดเวลาสำหรับผู้ที่มีปัญหาเดียวกัน


0

ตรวจสอบให้แน่ใจว่าไฟล์ spring jar ที่เกี่ยวข้องอยู่ในคลาสพา ธ รันไทม์ของคุณ ในกรณีของฉันนี้เราขาด spring-tx-4.3.4.RELEASE.jar จากคลาสพา ธ รันไทม์ หลังจากเพิ่มโถนี้ปัญหาได้รับการแก้ไขแล้ว


0

หากไม่มีการเชื่อมต่ออินเทอร์เน็ตในแพลตฟอร์มของคุณและคุณใช้ Eclipse ให้ทำตามขั้นตอนเหล่านี้ (ช่วยแก้ปัญหาของฉันได้)

  1. ค้นหาไฟล์ xsd ที่แน่นอน (คุณสามารถคลายซิปไฟล์เหล่านี้จากขวดได้ตัวอย่างเช่น spring-beans-xyxsd ใน spring-beans-xyzRELEASE.jar)
  2. เพิ่มไฟล์ xsd เหล่านี้ใน Eclipse XML Catalog (การตั้งค่า -> XML-> แค็ตตาล็อก XML เพิ่มไฟล์)
  3. เพิ่มตำแหน่งไฟล์เหล่านี้ในไฟล์คอนฟิกูเรชัน (โปรดใช้ความระมัดระวังเขียนไฟล์เวอร์ชันที่แน่นอน)

ตัวอย่าง:

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


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.