【问题标题】:Spring framework bean error [closed]Spring框架bean错误[关闭]
【发布时间】:2016-04-16 07:03:48
【问题描述】:

我正在尝试在 java 中学习 Spring。当我运行第一个程序时,我一开始就卡住了。 我正在尝试调用 Triangle 类的draw 方法。 但我看到很多错误。

DrawingApp.java 类中,eclipse 显示了一些警告 - (The type XmlBeanFactory is deprecated)。

我正在提供我的实现以及以下错误。

Triangle.java

package org.hemant.spring;

public class Triangle {

public void draw(){
    System.out.println("Triangle drawn");   
 }
}

DrawingApp.java

package org.hemant.spring;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;

public class DrawingApp {

 /**
 * @param args
 */
 public static void main(String[] args) {

    BeanFactory factory = new XmlBeanFactory(new   FileSystemResource("spring.xml"));

    Triangle triangle = (Triangle)factory.getBean("Triangle.class");
    triangle.draw();
    }

}

spring.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE bean PUBLIC "-//SPRING//DTD BEAN 2.0//EN"     "http://www.springframework.org/dtd/spring-bean-2.0.dtd">

<bean>
  <bean id="triangle" class="org.hemant.spring.Triangle"/>
</bean>

错误

     Apr 16, 2016 12:33:45 PM     org.springframework.beans.factory.xml.XmlBeanDefinitionReader    loadBeanDefinitions
    INFO: Loading XML bean definitions from file  [C:\Users\hemant001\workspace_mars_eclipse\spring tutorial\spring.xml]
Exception in thread "main"   org.springframework.beans.factory.BeanDefinitionStoreException: IOException  parsing XML document from file [C:\Users\hemant001\workspace_mars_eclipse\spring  tutorial\spring.xml]; nested exception is java.io.FileNotFoundException:  http://www.springframework.org/dtd/spring-bean-2.0.dtd
at  org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefiniti ons(XmlBeanDefinitionReader.java:408)
at  org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
at org.springframework.beans.factory.xml.XmlBeanFactory.<init> (XmlBeanFactory.java:78)
at org.springframework.beans.factory.xml.XmlBeanFactory.<init> (XmlBeanFactory.java:66)
at org.hemant.spring.DrawingApp.main(DrawingApp.java:17)
    Caused by: java.io.FileNotFoundException: http://www.springframework.org/dtd/spring-bean-2.0.dtd
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startEntity(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startDTDEntity(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.setInputSource(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.dispatch(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)
at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:75)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:388)
... 5 more

【问题讨论】:

  • 你有什么错误?
  • 我现在已经把错误,请帮助 - @PeterRader
  • 难道factory.getBean("Triangle.class"); 应该是factory.getBean("triangle"); 吗?
  • 哦,你添加了错误日志。它说你的xml是错误的。你有&lt;bean&gt;&lt;bean id="triangle"....&gt;&lt;/bean&gt;,它应该是&lt;beans&gt;&lt;bean id="triangle"....&gt;&lt;/beans&gt;。也许还有其他错误。
  • 哦...对不起,是的,它会是 factory.getBean("triangle"); ,但仍然错误是一样的??? - @JoseLuis

标签: java xml eclipse spring javabeans


【解决方案1】:

您应该在spring.xml 中将http://www.springframework.org/dtd/spring-bean-2.0.dtd 替换为http://www.springframework.org/dtd/spring-beans-2.0.dtd(注意beans,而不是bean)。

【讨论】:

    【解决方案2】:

    这个:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE bean PUBLIC "-//SPRING//DTD BEAN 2.0//EN"     "http://www.springframework.org/dtd/spring-bean-2.0.dtd">
    <bean>
      <bean id="triangle" class="org.hemant.spring.Triangle"/>
    </bean>
    

    应该是这样的

    <?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">
          <bean id="triangle" class="org.hemant.spring.Triangle"/>
    </beans>
    

    另外,就像 cmets 中提到的那样,factory.getBean("Triangle.class"); 应该是 factory.getBean("triangle");

    对于上下文,我宁愿这样做

    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    ...
    
            ApplicationContext context = new ClassPathXmlApplicationContext(
                    "spring.xml"); // or FileSystemXmlApplicationContext, if .xml is not in class path
    
            Triangle obj = (Triangle) context.getBean("triangle");
    

    您为什么使用 Spring 2.0 版(基于您的 dtd)?这真的老了。

    【讨论】:

    • 更好用getBean(Triangle.class)
    • 抛出新异常 - 线程“主”org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException 中的异常:来自文件 [C:\Users\hemant001\workspace_mars_eclipse\spring tutorial\ 的 XML 文档中的第 5 行spring.xml] 无效;嵌套异常是 org.xml.sax.SAXParseException;行号:5;列号:72;与元素类型“beans”关联的属性“xsi:schemaLocation”的前缀“xsi”未绑定。 - @eis
    • @Hemant 你是对的,从我的 .xml 示例中忘记了一行。我现在加了。 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 是我忘记的东西。
    【解决方案3】:
    1. 请不要再使用XmlBeanFactory,使用DefaultListableBeanFactory,因为它将读卡器与工厂分开并代表更干净的OOD。

    2. 这不是真正的错误,它是配置的格式问题(我解决这个问题是为了解释为什么 eclipse 不给你消息)。你看,无法读取的配置不是错误。这意味着您的应用程序运行良好(为您的第一次尝试感到自豪),但配置错误!解决doctype和ns的配置丢包问题。

    3. Triangle triangle = (Triangle)factory.getBean("Triangle.class"); 找不到定义。请改用Triangle triangle = factory.getBean(Triangle.class);,因为您不必投射。

    所以main 应该是这样的:

    DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
    XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
    reader.loadBeanDefinitions(new FileSystemResource("spring.xml"));
    Triangle triangle = factory.getBean(Triangle.class);
    triangle.draw();
    

    【讨论】:

    • 好主意。但我确实想解释一下为什么 Eclipse 会显示关于该类已弃用的警告。哦等等FileSystemXmlApplicationContext可能会自动重新加载xml。
    • 是的.....它完成了 - 非常感谢 - @eis
    猜你喜欢
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 2014-01-27
    • 2020-04-02
    • 2015-04-01
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多