应用程序上下文与Spring中的Web上下文有什么关系?

时间:2010-11-11 11:26:58

标签: java spring-mvc classloader

应用程序上下文 Web上下文(以及随之而来的类加载器问题)之间的分离是我不断遇到的问题。我在我的第一个项目中使用Spring,从一个编写糟糕的基于JSP的webapp迁移到基于Spring的。

我只是想知道这种配置是否有意义:

  • 我有控制器,表单对象等,使用注释定义并在Web应用程序上下文中进行扫描。
  • 我在最初将它们放在Web应用程序上下文后将DAO(数据访问对象)移动到应用程序上下文 - 这是因为我需要使用它们来获取spring安全性的用户/密码,这是一个应用程序上下文bean
  • Spring安全性如果在应用程序上下文中定义(根据文档),则需要DAO使用它。

现在我遇到了类加载器问题,我将对象传递给JDO / DataNucleus并且它是由web应用程序类加载器创建的,但是DAO都是应用程序上下文的一部分,因此该组件获得了自己的类加载器并且可以' t匹配相同的对象。

来自DAO的简单方法:

@Override
public boolean userExists(String username) {
    Query query = pm.newQuery(User.class);
    query.setFilter( "username == :usernameParam" );
    query.setResult( "count(username)" );
    query.setResultClass(Long.class);
    System.out.println(username);
    Long result = (Long)query.execute(username);

    return (result!=null && result>0);
}
  

javax.jdo.JDOUserException:查询   将返回单个字段,但它是   不是一致的类型   ResultClass(java.lang.Long):它是   java.lang.Long中

我问因为这不是第一个类加载器问题(我担心不是最后一个)因为Spring现在配置的方式弹出,所以我想知道我做得不好。

或许有一些配置可以解决我还没有意识到的这类类加载器问题?

1 个答案:

答案 0 :(得分:3)

类加载器应该与Spring上下文无关。 Web应用程序上下文是一个弹簧容器,通常包含控制器和视图解析器。应用程序上下文包含dao。 Web应用程序上下文将应用程序上下文作为父级,因此它可以访问dao和服务bean,反之亦然。但是,上下文都是同一个战争的一部分,应该由相同的类加载器加载。

看看你的异常,我认为,它似乎与Spring无关。