【问题标题】:why can't I access ApplicationContext from ApplicationContextAware implemented bean为什么我不能从 ApplicationContextAware 实现的 bean 访问 ApplicationContext
【发布时间】:2015-11-15 21:39:39
【问题描述】:

我有一个 Spring JUnit 测试器类 MySimpleTester:

@

RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:/spring/mySimpleConfig.xml"})
public class MySimpleTester {

@Before
    public void setUp() throws Exception {
        myAdapter = (MyAdapter) applicationContext.getBean("myAdapter");
    }

@test 
public void testGetSimpleList() {
        List<SimpleLink> simpleList = **myAdapter.getSimpleLinksList**();
}

... ...

在我的适配器类中:

public MyAdapter {
    public List<SimpleLink> getSimpleLinksList() {
        List<SimpleLink> simLinks = null;
        String environment = AppFactory.getPropertiesObj();

... ...

class AppFactory implements ApplicationContextAware {

    private static ApplicationContext context;

    public void setApplicationContext(ApplicationContext acontext) {
        context = acontext;
    }
    public getPropertiesObj() {
        return getAppContext().getBean("propertiesBean");
    }

我得到NullPointerException 并看到ApplicationContext 在这里是Null。

但是在SpringJUnitTestRunner 类MySimpleTester 我可以找到正确初始化的applicationContext。我不包括mySimpleConfig.xml 和包含的文件。 MyAdapter 类getSimpleLinksList() 中的方法在应用程序服务器中运行时在Web 应用程序中工作得非常好,并且在那里获得了appcontext。

只有通过 Spring 测试器才能访问静态应用程序上下文 AppFactory 类,因为它是通过 AppFactory.getPropertiesObj() 静态调用的。当其他测试类正在执行时,我正确设置了类路径。

【问题讨论】:

  • MyAdapter.getSimpleLinksList() 如何编译,因为AppFactory.getPropertiesObj() 不是静态的?
  • 在实际程序中,我确实有静态方法。在这里写作时,我错过了打字。 public static String getPropertiesObj() { return getAppContext().getBean("propertiesBean").toString(); }

标签: spring springjunit4classrunner


【解决方案1】:

如果你想在 MySimpleTester 中访问当前的 ApplicationContext:-

public class MySimpleTester {

@Autowired
ApplicationContext applicationContext;

@Before
    public void setUp() throws Exception {
        myAdapter = (MyAdapter) applicationContext.getBean("myAdapter");
    }

@test 
public void testGetSimpleList() {
        List<SimpleLink> simpleList = **myAdapter.getSimpleLinksList**();
}

【讨论】:

  • 我没有明白你的意思阿米特。请注意 MySimpleTester 是主要的 Junit 类,因此它需要加载 Spring 上下文 Xmls。所以我确实需要它有 RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations={"classpath:/spring/mySimpleConfig.xml"}) 我的要求是在 AppFactory 类中,它应该获得与主 Junit 类相同的 ApplicationContext 。为什么 AppFactory 无法获取 ApplicationContext 对象引用并且为 null ???
【解决方案2】:

我认为这是在创建多个应用程序上下文时发生的。 AplliCationContext 对象应该是单例的。但是当我们再次从静态方法调用 applicationContext 时,它指的是完全不同的配置。 ApplicationContext 甚至没有在那里初始化。

当从 Spring MVC webcontanier 调用相同的模块时,不会发生这种情况。仅当您尝试使用 Spring 测试器类 RunWith(SpringJUnit4ClassRunner.class) 时才会发生这种情况。我可以在业务方法中传递 AppContext,但我不想更改业务方法签名。我在 spring 社区中发现了一些类似问题的线程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多