我正在尝试部署一个简单的弹簧应用程序。它需要一个用户名(来自jsp),将值插入数据库并在新的jsp页面上显示问候语hello!, [username]
。
我的环境是:
我收到如下错误:
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。
答案 0 :(得分:1)
如果在方法Profile
中创建formBackingObject
命令,那么它将不会由Spring处理,也不会填充dataSource
。你可以在这个方法中设置它,或者从spring bean holder获取bean。
此外,您需要知道,在创建spring bean时,默认情况下是单例。这意味着您的所有控制器都将使用(并修改)此实例。 Imho这不是你想要的。您可以使用scope="request"
作为模型bean。
或者最好保持模型清洁,简单的POJO,并将所有以数据库为中心的代码移动到控制器/数据库层。
答案 1 :(得分:0)
您正尝试使用spring应用DDD(域驱动设计),这并不容易。 “差距”是因为:
Read this有关使用spring实现DDD的一些提示。
或者,如果您不确定是否要使用DDD,请遵循splix的建议并将数据与业务操作分开。
(DDD意味着你的类定义了数据和对该数据的操作。在非DDD中它们是分开的。你得到了异常,因为(也许)Profile是由你实例化的,而不是Spring框架)