Python转java开发,瞬间感觉框架好难受,总是不注意注解,找的很辛苦,读次文章,一定一定请注意注解,,,,,
今天在调试代码时,Spring启动后出现了错误:Injection of autowired dependencies failed;……的错误。
详细的错误信息如下:
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userServiceImpl': Injection of autowired dependencies failed;
经过一个多小时的Code Review和调试终于解决了问题,最后总结解决问题的方法,其实是MyBatis的一个映射文件中的resultType=”java.lang.Integer” parameterType=”java.lang.Integer”写错误。
但是这个错误却引发了Injection of autowired dependencies failed;……的错误。一开始以为是Spring配置文件错误了;再后来仔细检查各个包下面的注解;最后检查MyBatis配置文件时才发现了错误。
浪费时间的地方在于:一开始总是认为Spring配置文件和Spring注解使用错误;没有仔细检查MyBatis的映射文件。
在解决这个问题的过程中,在网上发现其实很多帖子,很多开发者都遇到过类似的问题;但是发现很多帖子都没有给出完整、准确的解决方法。所以总结一下解决过程和思路。
样例代码如下:
1. Spring配置文件applicationContext.xml的要点
2. DAO层代码
package com.keymen.annotation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
@Repository
@Autowired
public @interface MyBatisDAO {
}
package com.keymen.dao;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import com.keymen.annotation.MyBatisDAO;
import com.keymen.entity.User;
@MyBatisDAO
public interface UserDao {
@Autowired
User selectByPrimaryKey(Integer id);
@Autowired
List queryAllUser();
@Autowired
public User findUserByUsername(String username);
@Autowired(required=true)
public Integer getCountOfRecord();
}
3. Service层代码
package com.keymen.service;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.keymen.entity.User;
/**
* 注意:这里的@Service注解不能少
*/
@Service
public interface UserService {
@Autowired
public User getUserById(int userId);
@Autowired
public List queryAllUser();
@Autowired
public Map findUserByUsername(String username);
@Autowired
public int getCountOfRecord();
}
package com.keymen.service.impl;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.keymen.dao.UserDao;
import com.keymen.entity.User;
import com.keymen.service.UserService;
/**
* 注意:这里的@Service注解不能少
*/
@Service
@Transactional
public class UserServiceImpl implements UserService{
@Autowired
private UserDao userDao;
@Override
public User getUserById(int userId) {
System.out.println("111---11111");
System.out.println(userDao);
return this.userDao.selectByPrimaryKey(userId);
}
@Override
public List queryAllUser() {
// TODO Auto-generated method stub
List userList=this.userDao.queryAllUser();
return userList;
}
@Override
public Map findUserByUsername(String username) {
// TODO Auto-generated method stub
User user=this.userDao.findUserByUsername(username);
HashMap userMap=new HashMap();
userMap.put(username, user);
return userMap;
}
@Override
public int getCountOfRecord() {
// TODO Auto-generated method stub
int count=this.userDao.getCountOfRecord();
return count;
}
}
4. MyBatis映射文件代码
5. 调试代码
package com.keymen.test;
import java.util.Map;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.keymen.entity.User;
import com.keymen.service.impl.UserServiceImpl;
public class TestGetCountOfRecord {
public static ApplicationContext ctx=null;
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("Hello Spring MyBatis!");
System.out.println("Count of Records:");
ctx = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
UserServiceImpl userServiceImpl = (UserServiceImpl) ctx.getBean("userServiceImpl");
int countOfRecord = userServiceImpl.getCountOfRecord();
System.out.println("Total Count of Records: "+countOfRecord);
}
}
出错的代码:
修改之后的代码:
一个数据类型的错误,浪费了一个多小时的时间。
总结心得:
遇到问题,不要着急。
分析问题。
确立解决问题的思路。
解决问题。
解决问题之后的总结。