Spring应用程序中的dataSource的IllegalArgumentException

时间:2010-02-25 10:19:29

标签: java spring

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

我的环境是:

  • 操作系统:windows xp professional
  • Db:MS访问(这只是为了先尝试一下,打算转移到mySQL)
  • IDE:eclipse
  • 服务器: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>

我在控制台下设置了DSN(usernamedb) - &gt; admin tools-&gt; odbc sources-&gt;用户DSN。问题似乎与dataSource的网址有关。

来自控制器类和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。

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

感谢
Neetu。

2 个答案:

答案 0 :(得分:1)

如果在方法Profile中创建formBackingObject命令,那么它将不会由Spring处理,也不会填充dataSource。你可以在这个方法中设置它,或者从spring bean holder获取bean。

此外,您需要知道,在创建spring bean时,默认情况下是单例。这意味着您的所有控制器都将使用(并修改)此实例。 Imho这不是你想要的。您可以使用scope="request"作为模型bean。

或者最好保持模型清洁,简单的POJO,并将所有以数据库为中心的代码移动到控制器/数据库层。

答案 1 :(得分:0)

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

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

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

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

(DDD意味着你的类定义了数据和对该数据的操作。在非DDD中它们是分开的。你得到了异常,因为(也许)Profile是由你实例化的,而不是Spring框架)