发表于: 2017-04-07 00:58:50

3 1082


今天完成的事情:

1.学习 Spring


明天计划的事情:

1.解决这个 bug

2.完成展现层


遇到的问题:

1.在进行完成服务层后进行单元测试发现了问题,怎么也解决不了的BUG

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'loginLogDao': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void com.draper.dao.LoginLogDao.setJdbcTemplate(org.springframework.jdbc.core.JdbcTemplate); nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jdbcTemplate' defined in URL [file:/D:/Development/JSP/SpringLearning10/target/classes/draper-context.xml]: Initialization of bean failed; nested exception is org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'java.lang.String' to required type 'javax.sql.DataSource' for property 'dataSource'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [javax.sql.DataSource] for property 'dataSource': no matching editors or conversion strategy found

at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1210)

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)

at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)

at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)

at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299)

at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)

at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755)

at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)

at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)

at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:125)

at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:60)

at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.delegateLoading(AbstractDelegatingSmartContextLoader.java:109)

at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContext(AbstractDelegatingSmartContextLoader.java:261)

at org.springframework.test.context.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:68)

at org.springframework.test.context.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:86)

at org.springframework.test.context.DefaultTestContext.getApplicationContext(DefaultTestContext.java:72)

at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:117)

at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83)

at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:212)

at org.springframework.test.context.testng.AbstractTestNGSpringContextTests.springTestContextPrepareTestInstance(AbstractTestNGSpringContextTests.java:145)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:497)

at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:80)

at org.testng.internal.Invoker.invokeConfigurationMethod(Invoker.java:564)

at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:213)

at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:138)

at org.testng.internal.TestMethodWorker.invokeBeforeClassMethods(TestMethodWorker.java:175)

at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:107)

at org.testng.TestRunner.privateRun(TestRunner.java:767)

at org.testng.TestRunner.run(TestRunner.java:617)

at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)

at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)

at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)

at org.testng.SuiteRunner.run(SuiteRunner.java:240)

at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)

at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)

at org.testng.TestNG.runSuitesSequentially(TestNG.java:1198)

at org.testng.TestNG.runSuitesLocally(TestNG.java:1123)

at org.testng.TestNG.run(TestNG.java:1031)

at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:72)

at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:127)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:497)

at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void com.draper.dao.LoginLogDao.setJdbcTemplate(org.springframework.jdbc.core.JdbcTemplate); nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jdbcTemplate' defined in URL [file:/D:/Development/JSP/SpringLearning10/target/classes/draper-context.xml]: Initialization of bean failed; nested exception is org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'java.lang.String' to required type 'javax.sql.DataSource' for property 'dataSource'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [javax.sql.DataSource] for property 'dataSource': no matching editors or conversion strategy found

at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:649)

at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)

at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331)

... 49 more


描述下这个项目,就是一个验证用户登录的一个简单实例,并实现记录日志的作用

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:p="http://www.springframework.org/schema/p"
      xmlns:aop="http://www.springframework.org/schema/aop"
      xmlns:context="http://www.springframework.org/schema/context"
      xmlns:tx="http://www.springframework.org/schema/tx"
      xmlns:http="http://www.springframework.org/schema/c"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context-4.0.xsd
      http://www.springframework.org/schema/tx
      http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
      http://www.springframework.org/schema/aop
      http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">

   <!--扫描 dao 类包,应用 Spring 的注解配置-->
   <context:component-scan base-package="com.draper.dao"/>

   <!--扫描 service 类包,应用 Spring 的注解配置-->
   <context:component-scan base-package="com.draper.service"/>

   <context:annotation-config/>

   <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
         destroy-method="close"
         p:driverClassName="com.mysql.jdbc.Driver"
         p:url="jdbc:mysql://localhost:3306/sampledb"
         p:username="Draper"
         p:password="XXXXXXX"/>

   <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"
         p:dataSource="dataSource"/>

   <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
         p:dataSource="dataSource"/>

   <aop:config  proxy-target-class="true">
       <aop:pointcut id="serviceMethod"
                     expression="(execution(* com.draper.service..*(..))) and
(@annotation(org.springframework.transaction.annotation.Transactional))"/>
       <aop:advisor pointcut-ref="serviceMethod" advice-ref="txAdvice"/>

   </aop:config>

   <tx:advice id="txAdvice" transaction-manager="transactionManager">
       <tx:attributes>
           <tx:method name="*"/>
       </tx:attributes>
   </tx:advice>

</beans>

我是按照书上的例子打的。大概有以下几个想法

① 配置文件有问题

② 根据 BUG 的描述来看好像是转型错误,不能理解为什么,看描述是还要配置 web 里面的其他文件,也不知道是哪个,目录在哪具体是啥,也没有涉及到 Web 啊

③ 也有人说是依赖注入是依赖接口不是实现类,可是书中就是这样描述的,我觉得不应该是这个问题

④ 有人说 注解没有写 所以我附下代码的例子

Dao 层 

@Repository
public class LoginLogDao {

   private JdbcTemplate jdbcTemplate;

   private final static String INSERT_LOGIN_LOG_SQL = " INSERT INTO " +
       " t_login_log(user_id,ip,login_datetime) VALUES (?,?,?)";

   @Autowired
   public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
       this.jdbcTemplate = jdbcTemplate;
   }

   public void insertLoginLog(LoginLog loginLog) {
       Object[] args = {loginLog.getUserId(), loginLog.getIp(), loginLog.getLoginDate()};
   }
}

Service 层

@Service
public class UserService {

   private UserDao userDao;
   private LoginLogDao loginLogDao;

   @Autowired
   public void setUserDao(UserDao userDao) {
       this.userDao = userDao;
   }

   @Autowired
   public void setLoginLogDao(LoginLogDao loginLogDao) {
       this.loginLogDao = loginLogDao;
   }

   public boolean hasMatchUser(String userName, String password) {
       int matchCount = userDao.getMatchCount(userName, password);
       return matchCount > 0;
   }

   public User findUserByUserName(String userName) {
       return userDao.findUserByUserNmae(userName);
   }

   @Transactional
   public void loginSuccess(User user) {
       user.setCredits(5 + user.getCredits());
       LoginLog loginLog = new LoginLog();
       loginLog.setUserId(user.getUserId());
       loginLog.setIp(user.getLastIp());
       loginLog.setLoginDate(user.getLastVisit());
       userDao.updateLoginInfo(user);
       loginLogDao.insertLoginLog(loginLog);
   }
}


最后附下测试代码

@ContextConfiguration("classpath*:draper-context.xml")
public class UserServiceTest extends AbstractTransactionalTestNGSpringContextTests {

   private UserService userService;

   @Autowired
   public void setUserService(UserService userService) {
       this.userService = userService;
   }

   @Test
   public void testHasMatchUser() {
       boolean b1 = userService.hasMatchUser("admin", "123456");
       boolean b2 = userService.hasMatchUser("admin", "1111");
       Assert.assertEquals(true, b1);
       Assert.assertEquals(false, b2);
   }

   @Test
   public void testFindUserByUserName() {
       User user = userService.findUserByUserName("admin");
       Assert.assertEquals("admin", user.getUserName());
   }
}

花了很长时间


收获:

1.白瞎了很多时间,尽处理 bug 了


返回列表 返回列表
评论

    分享到