● 按照AppFuse帮助,实践
实践次步时,一切都还正常,唯有最后测试时,始终不通,试了n多办法,无果。如果那位网友看到,知道结果的,烦请告知,在此先谢过了。
具体的错误分析见文尾。
Person是基本的POJO,PersonDAO是Person的管理类,PersonManager是 Business Facades. 这些façade用于连接前端和DAO层之间的通讯。
Ø 在web环境下,Spring通过配置初始化后,使用WebApplicationContextUtils来获得ApplicationContext.
ApplicationContext ctx =
WebApplicationContextUtils.getRequiredWebApplicationContext(context);
Ø 在非web环境中,则通过ClassPathXmlApplicationContext获得ApplicationContext
ResourceBundle db = ResourceBundle.getBundle("database");
String daoType = db.getString("dao.type");
String[] paths = {"/WEB-INF/applicationContext-resources.xml",
"/WEB-INF/applicationContext-" + daoType + ".xml"};
ctx = new ClassPathXmlApplicationContext(paths);
Ø 建立PersonDAO接口
package org.dudu.dao;
import org.dudu.model.Person;
public interface PersonDAO extends DAO
{
public Person getPerson(Long personId);
public void savePerson(Person person);
public void removePerson(Long personId);
}
Ø 建立PersonDAO的的具体实现类
package org.dudu.dao.hibernate;
import org.dudu.model.Person;
import org.dudu.dao.PersonDAO;
import org.springframework.orm.ObjectRetrievalFailureException;
public class PersonDAOHibernate extends BaseDAOHibernate implements PersonDAO
{
public Person getPerson(Long personId)
{
Person person = (Person)getHibernateTemplate().get(Person.class,personId);
if(person == null)
{
throw new ObjectRetrievalFailureException(Person.class,personId);
}
return person;
}
public void removePerson(Long personId)
{
getHibernateTemplate().delete(getPerson(personId));
}
public void savePerson(Person person)
{
getHibernateTemplate().saveOrUpdate(person);
}
}
Ø 建立PersonDAO的测试类
package org.dudu.dao;
import org.dudu.model.Person;
import org.springframework.dao.DataAccessException;
public class PersonDAOTest extends BaseDAOTestCase{
private Person person = null;
private PersonDAO dao = null;
protected void setUp() throws Exception {
super.setUp();
dao = (PersonDAO)ctx.getBean("personDAO");
}
protected void tearDown() throws Exception {
super.tearDown();
dao = null;
}
public void testGetPerson() throws Exception
{
person = new Person();
person.setFirstName("dudu");
person.setLastName("tu");
dao.savePerson(person);
assertNotNull(person.getId());
person = dao.getPerson(person.getId());
assertEquals(person.getFirstName(),"dudu");
}
public void testSavePerson() throws Exception
{
person = dao.getPerson(new Long(1));
person.setFirstName("dudu");
person.setLastName("last name updated");
dao.savePerson(person);
if(log.isDebugEnabled())
{
log.debug("update person" + person);
}
}
public void testAddAndRemovePerson() throws Exception
{
person = new Person();
person.setFirstName("Zhang");
person.setLastName("San");
dao.savePerson(person);
assertEquals(person.getFirstName(),"Zhang");
assertNotNull(person.getId());
if(log.isDebugEnabled())
{
log.debug("remove person...");
}
dao.removePerson(person.getId());
try
{
person = dao.getPerson(person.getId());
fail("Person found in database");
}
catch(DataAccessException dae)
{
log.debug("Excepted exception:" + dae.getMessage());
assertNotNull(dae);
}
}
}
Ø 配置信息
Ø applicationContext-hibernate.xml
<bean id="personDAO" class="org.dudu.dao.hibernate.PersonDAOHibernate">
<property name="sessionFactory"><ref local="sessionFactory"/></property>
</bean>
Ø applicationContext-resources.xml
<beans>
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:mail.properties</value>
<value>database.properties</value>
</list>
</property>
</bean>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>${hibernate.connection.driver_class}</value>
</property>
<property name="url">
<value>${hibernate.connection.url}</value>
</property>
<property name="username">
<value>${hibernate.connection.username}</value>
</property>
<property name="password">
<value>${hibernate.connection.password}</value>
</property>
</bean>
</beans>
Ø database.properties
#Hibernate Configuration for JUnit tests
#Sun Jul 10 18:03:26 CST 2005
hibernate.connection.username=test
dao.type=hibernate
hibernate.connection.password=test
hibernate.dialect=net.sf.hibernate.dialect.MySQLDialect
hibernate.connection.url=jdbc\:mysql\://localhost/appfuse?autoReconnect\=true&useUnicode\=true&characterEncoding\=utf-8
hibernate.connection.show_sql=true
hibernate.connection.driver_class=com.mysql.jdbc.Driver
Ø 运行测试:ant test-dao -Dtestcase=PersonDAO
报错:
[junit] [dudu] WARN [main] JDBCExceptionReporter.logExceptions(57) | SQL Err
or: 0, SQLState: 08001
[junit] [dudu] ERROR [main] JDBCExceptionReporter.logExceptions(58) | Server
connection failure during transaction. Due to underlying exception: 'java.net.S
ocketException: java.net.SocketException: Permission denied: connect'.
[junit] ** BEGIN NESTED EXCEPTION **
[junit] java.net.SocketException
[junit] MESSAGE: java.net.SocketException: Permission denied: connect
[junit] STACKTRACE:
[junit] java.net.SocketException: java.net.SocketException: Permission denie
d: connect
[junit] at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFa
ctory.java:156)
[junit] at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:283)
[junit] at com.mysql.jdbc.Connection.createNewIO(Connection.java:2666)
[junit] at com.mysql.jdbc.Connection.<init>(Connection.java:1474)
[junit] at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDri
ver.java:264)
[junit] at java.sql.DriverManager.getConnection(DriverManager.java:525)
[junit] at java.sql.DriverManager.getConnection(DriverManager.java:171)
[junit] at org.springframework.jdbc.datasource.DriverManagerDataSource.g
etConnectionFromDriverManager(DriverManagerDataSource.java:156)
[junit] at org.springframework.jdbc.datasource.DriverManagerDataSource.g
etConnectionFromDriverManager(DriverManagerDataSource.java:144)
[junit] at org.springframework.jdbc.datasource.DriverManagerDataSource.g
etConnection(DriverManagerDataSource.java:132)
[junit] at org.springframework.orm.hibernate.LocalDataSourceConnectionPr
ovider.getConnection(LocalDataSourceConnectionProvider.java:59)
[junit] at net.sf.hibernate.cfg.SettingsFactory.buildSettings(SettingsFa
ctory.java:84)
[junit] at net.sf.hibernate.cfg.Configuration.buildSettings(Configuratio
n.java:1160)
[junit] at net.sf.hibernate.cfg.Configuration.buildSessionFactory(Config
uration.java:794)
[junit] at org.springframework.orm.hibernate.LocalSessionFactoryBean.new
SessionFactory(LocalSessionFactoryBean.java:475)
[junit] at org.springframework.orm.hibernate.LocalSessionFactoryBean.aft
erPropertiesSet(LocalSessionFactoryBean.java:413)
[junit] at org.springframework.beans.factory.support.AbstractAutowireCap
ableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:990)
[junit] at org.springframework.beans.factory.support.AbstractAutowireCap
ableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:275)
[junit] at org.springframework.beans.factory.support.AbstractAutowireCap
.getBean(AbstractBeanFactory.java:163)
[junit] at org.springframework.beans.factory.support.DefaultListableBean
Factory.preInstantiateSingletons(DefaultListableBeanFactory.java:230)
[junit] at org.springframework.context.support.AbstractApplicationContex
t.refresh(AbstractApplicationContext.java:310)
[junit] at org.springframework.context.support.ClassPathXmlApplicationCo
ntext.<init>(ClassPathXmlApplicationContext.java:80)
[junit] at org.springframework.context.support.ClassPathXmlApplicationCo
ntext.<init>(ClassPathXmlApplicationContext.java:65)
[junit] at org.dudu.dao.BaseDAOTestCase.<clinit>(BaseDAOTestCase.java:35
)
[junit] at java.lang.Class.forName0(Native Method)
[junit] at java.lang.Class.forName(Class.java:164)
[junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.
<init>(JUnitTestRunner.java:204)
[junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.
<init>(JUnitTestRunner.java:177)
[junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.
main(JUnitTestRunner.java:519)
[junit] ** END NESTED EXCEPTION **
Ø 错误分析
从错误报告中分析,错误原因是和Mysql数据没有建立起连接。
我尝试了多种方法,直接改写applicationContext-resources.xml文件、更好最新的mysql
驱动等,都徒劳。
但通过web容器访问,使用Jndi
(1)<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName"><value>java:comp/env/jdbc/appfuse</value></property>
</bean>
(2) ApplicationContext ctx =
WebApplicationContextUtils.getRequiredWebApplicationContext(context);
访问时就可以连接数据库。
不知何故,如有那位兄台知道答案,望不吝赐教。