1

我正在阅读 Spring 教程并遇到以下示例。它提到Spring支持Java EE注解@Resource。我正在尝试使用下面的源代码的示例,但它给出了 InvocationTargetException。我想这可能是由于无法正确注入 SpellChecker 对象。

相关堆栈跟踪: 2018 年 2 月 27 日晚上 8:56:23 org.springframework.context.support.AbstractApplicationContext prepareRefresh 信息:刷新 org.springframework.context.support.ClassPathXmlApplicationContext@5d76b067:启动日期 [2018 年 2 月 27 日星期二 20:56:23 CST];上下文层次结构的根 2018 年 2 月 27 日晚上 8:56:32 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitionsINFO:从类路径资源 [Beans.xml] 加载 XML bean 定义在 TextEditor 构造函数内部。在 SpellChecker 构造函数内部。java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 的线程“main”java.lang.reflect.InvocationTargetException 中的异常java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl。

我尝试使用 @Autowired 注释而不是 @Resource 注释,它给出了预期的结果:

在 TextEditor 构造函数内部。
在 SpellChecker 构造函数内部。
里面检查拼写。

想看看您是否可以建议/指出错误,如果有的话,非常感谢。

(参考: https ://www.tutorialspoint.com/spring/spring_jsr250_annotations.htm )

[文本编辑器.java]

import javax.annotation.Resource;

public class TextEditor {
  private SpellChecker spellChecker;

  public TextEditor() {
    System.out.println("Inside TextEditor constructor.");
  }

  @Resource(name = "spellChecker")
  public void setSpellChecker(SpellChecker spellChecker) {
    this.spellChecker = spellChecker;
  }

  public SpellChecker getSpellChecker() {
    return spellChecker;
  }

  public void spellCheck() {
    spellChecker.checkSpelling(); //Gave InvocationTargetException here
  }
}

[拼写检查器.java]

public class SpellChecker {
  public SpellChecker() {
    System.out.println("Inside SpellChecker constructor.");
  }

  public void checkSpelling() {
    System.out.println("Inside checkSpelling.");
  }
}

[主应用程序.java]

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
  public static void main(String[] args) {
    ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
    TextEditor te = (TextEditor) context.getBean("textEditor");
    te.spellCheck();
  }
}

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

   <context:annotation-config/>

   <!-- Definition for textEditor bean without constructor-arg  -->
   <bean id = "textEditor" name = "textEditor" class = "com.tutorialspoint.TextEditor"></bean>

   <!-- Definition for spellChecker bean -->
   <bean id = "spellChecker" name = "spellChecker" class = "com.tutorialspoint.SpellChecker"></bean>
</beans>
4

0 回答 0