【问题标题】:IllegalArgumentException for dataSource in Spring applicationSpring 应用程序中数据源的 IllegalArgumentException
【发布时间】:2010-02-25 10:19:28
【问题描述】:

我正在尝试部署一个简单的 spring 应用程序。它需要一个用户名(来自一个 jsp),将该值插入到一个数据库中,并在一个新的 jsp 页面上显示一个问候语,上面写着hello!, [username]

我的环境是:

  • 操作系统:windows xp 专业版
  • Db:MS 访问(这只是一开始的尝试,打算转向 mySQL)
  • IDE:日食
  • 服务器:Tomcat 6

我收到如下错误:

Feb 25, 2010 11:21:04 AM org.springframework.web.servlet.FrameworkServlet processRequest SEVERE: Could not complete request java.lang.IllegalArgumentException: dataSource is required
      at org.springframework.jdbc.support.JdbcAccessor.afterPropertiesSe(JdbcAccessor.java:130)
      at org.springframework.jdbc.core.JdbcTemplate.<init>(JdbcTemplate.java:122)
      at SpringClasses.Profile.setUsername(Profile.java:32) ………

applicationContext文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
    <property name="dataSource"><ref bean="dataSource"/></property> 
</bean> 

<bean id="Profile" class="SpringClasses.Profile"> 
    <property name="dataSource"><ref bean="dataSource"/></property> 
</bean>

<bean id="dataSource"       class="org.springframework.jdbc.datasource.DriverManagerDataSource" singleton="true" destroy-method="close">
    <property name="driverClassName" value="sun.jdbc.odbc.JdbcOdbcDriver"/>
    <property name="url" value="jdbc:odbc:usernamedb"/>
    <property name="username" value="admin"/>
    <property name="password" value=""/>
</bean>
</beans>
</code>

我在控制面板->管理工具->odbc源->用户DSN下设置了DSN(usernamedb)。问题似乎出在dataSource的URL上。

控制器类和bean类的相关java代码如下

来自 ProfileFormController.java 类:

protected ModelAndView onSubmit(Object command)
{
  Profile profile = (Profile) command; 
  String greeting = "Hello," + profile.getUsername() + "!";
  profile.setUsername(profile.getUsername());
  return new ModelAndView("greetingDisplay", "greeting", greeting);
}

来自 Profile.java 类:

private String username;
private JdbcTemplate jt;
private DataSource dataSource;

public Profile() {
 }

public Profile(String username) {
this.username = username;
}

public String getUsername() {
return username;
}
public String setUsername(String username) {
int rowsInserted;
setDataSource(dataSource);
jt = new JdbcTemplate(dataSource);
rowsInserted = jt.update("insert into username_db (username) values(?)",new Object[]      {username});

//System.out.println("In Profile.getUsername, num. of rows inserted:"+rowsInserted);
return username;
 }
public void setDataSource(DataSource dataSource) {
 this.jt = new JdbcTemplate(dataSource);
  }

在 web.xml 中配置 Profile bean 如下:

<bean id="profileFormController" class="SpringClasses.ProfileFormController">
    <property name="commandName">
       <value>profile</value
    </property>
    <property name="formView">
       <value>profile</value>
    </property>
    <property name="successView">
       <value>greetingDisplay</value>
    </property>

 </bean>

在 ProfileFormController 中,我将构造函数设置如下:

public ProfileFormController() { 
  setCommandClass(Profile.class); 
  setCommandName("profile"); }

也在 web.xml 中添加了 contextLoaderServlet。

我错过了什么?非常感谢您的帮助。

谢谢
尼图。

【问题讨论】:

  • 显示如何配置控制器,以及从何处获取配置文件命令
  • 已编辑以提供来自 web.xml 的配置详细信息
  • 虽然在问题中提到 Access 很有用,但我认为该标签没有用,因为您的问题与数据存储有关。
  • David:我想知道我提供的 URL 格式是否正确。
  • 我不知道你指的是什么网址。我没有在 Spring 或 Java 中编程,所以我并没有真正查看代码,只是看看那里是否有连接字符串,我没有看到。

标签: java spring


【解决方案1】:

如果您在方法formBackingObject 中创建Profile 命令,则Spring 不会对其进行处理,并且不会填充dataSource。你可以在这个方法中设置,或者从spring beans holder中获取bean。

您还需要知道,当您创建 Spring bean 时,默认情况下它是单例的。这意味着您的所有控制器都将使用(并修改)它的一个实例。恕我直言,这不是你想要的。您可以将 scope="request" 用于您的模型 bean。

或者最好保持模型干净,作为简单的 POJO,并将所有以 db 为中心的代码移动到控制器/db 层。

【讨论】:

    【解决方案2】:

    您正在尝试将 DDD(域驱动设计)与 spring 一起应用,这并不容易。 “差距”是因为:

    • 域对象必须由您实例化
    • 域对象应该由弹簧管理,以便应用依赖注入。

    Read this 获取有关使用 spring 实现 DDD 的一些提示。

    或者如果您不确定是否要使用 DDD,那么请遵循 splix 的建议,将数据与业务运营分开。

    (DDD 意味着您的类定义了数据和对该数据的操作。在非 DDD 中,它们是分开的。您收到异常是因为(也许)配置文件是由您实例化的,而不是由 spring 框架实例化的)

    【讨论】:

    • 按照 splix 的建议,我创建了一个带有数据库相关操作的 ProfileDao 类。我仍然不明白为什么我得到“dataSource required exception”。另外,我是一个春季新手,整个 DDD 部分都超出了我的想象。我需要添加/删除一些配置吗?换个网址吧?
    • 没有。 DDD 意味着您的对象既包含数据又包含对该数据的操作。在非 DDD 中,它们是分开的。您收到异常是因为(可能)配置文件是由您实例化的,而不是由 spring 框架实例化的。
    猜你喜欢
    • 2011-01-10
    • 2015-07-10
    • 1970-01-01
    • 2015-11-11
    • 2011-02-08
    • 2016-10-22
    • 2018-02-25
    • 1970-01-01
    • 2018-06-29
    相关资源
    最近更新 更多