在Maven父子项目中搭建了一个SpringBpoot的Web模块工程,项目当中的DAO和Service层的接口和实现类都集成公共基类,但是启动报错

u011013470 2018-06-27 05:52:58
在Maven父子项目当中的的搭建了一个SpringBpoot的Web模块工程,项目当中的DAO和Service层的接口和实现类都集成公共基类,但是启动报错

项目结构 包名

system
|-system-modle com.system.model
|-system-common com.system.common
|-system-dao com.system.dao mybatis文件 resource/main/mybatis/mapper/
|-system-dao-common com.system.dao.common
|-system-dao-user com.system.dao.user
|-system-service com.system.service
|-system-service-common com.system.service.common
|-system-service-user com.system.service.user
|-system-web (springboot项目启动类工程) com.system(本项目的启动类SystemWebApplication就放在咋换个包的下面)
|-system-web-common com.system.web.common
|-system-web-user com.system.web.user

项目启动类
@EnableAutoConfiguration
@SpringBootApplication(
exclude = {DataSourceAutoConfiguration.class})
@ComponentScan(basePackages={"com.system.dao",
"com.system.service", "com.system.web.controller"})
@MapperScan(basePackages={"com.system.dao"})
public class SystemWebApplication {

public static void main(String[] args) {
SpringApplication.run(SystemWebApplication.class, args);
}
}

由于此项目的DAO、Service、Web层接口、配置文件和实现类都在其他工程包下面,所以SpringBoot启动类扫描不到这些代码,
所以,我把com.system.dao,com.system.service,com.system.web.controller这几个包都用@ComponentScan配置了出来,
还有DAO层包还有@MapperScan单独配置了出来

application.yml配置文件

server:
port: 8090

spring:
mvc:
view:
prefix: /jsp/
suffix: .jsp
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/system?useUnicode=true&characterEncoding=UTF-8
username: root
password: 123
type: com.alibaba.druid.pool.DruidDataSource

mybatis:
mapper-locations: classpath:mybatis/mapper/*/*.xml


公共DAO接口

public interface IBasicDao<T> {

public int insert(T obj) throws Exception;

public int batchInsert(List<T> list) throws Exception;

public int delete(T obj) throws Exception;

public int deleteById(@Param(value = "id") int id) throws Exception;

public int batchDelete(Integer[] list) throws Exception;

public int update(T obj) throws Exception;

public int batchUpdate(List<T> list) throws Exception;

public T select(@Param(value = "id") int id) throws Exception;

public List<T> selectAll() throws Exception;

public List<T> selectList(T obj) throws Exception;

public T selectNew() throws Exception;

public List<T> selectNewList(@Param(value = "count") int count) throws Exception;

public int getCount(Map<String, Object> param) throws Exception;

public List<T> getSplitList(Map<String, Object> param) throws Exception;
}

用户信息接口

@Mapper
@Component("userBaseDao")
public interface IUserBaseDao extends IBasicDao<UserInfo> {

}


Service层公共接口

public interface IBaseService<T> {

public int add(T obj) throws LogicException;

public int delete(T obj) throws LogicException;

public int deleteById(int id) throws LogicException;

public int update(T obj) throws LogicException;

public T find(int id) throws LogicException;

public List<T> findAll() throws LogicException;

public List<T> findList(T obj) throws LogicException;

}

Service层公共接口实现类

public class BaseServiceImpl<T, I extends IBasicDao<T>> implements IBaseService<T> {

public I getBasicDao() {
return basicDao;
}

public void setBasicDao(I basicDao) {
this.basicDao = basicDao;
}

@Transactional(propagation = Propagation.REQUIRED, rollbackFor = LogicException.class)
public int add(T obj) throws LogicException {
return basicDao.insert(obj);
}

@Transactional(propagation = Propagation.REQUIRED, rollbackFor = LogicException.class)
public int delete(T obj) throws LogicException {
return basicDao.delete(obj);
}

@Transactional(propagation = Propagation.REQUIRED, rollbackFor = LogicException.class)
public int deleteById(int id) throws LogicException {
return basicDao.deleteById(id);
}

@Transactional(propagation = Propagation.REQUIRED, rollbackFor = LogicException.class)
public int update(T obj) throws LogicException {
return basicDao.update(obj);
}

public T find(int id) throws LogicException {
return basicDao.select(id);
}

public List<T> findAll() throws LogicException {
return basicDao.selectAll();
}

public List<T> findList(T obj) throws LogicException{
return basicDao.selectList(obj);
}
}

用户信息Service层接口

public interface IUserBaseService extends IBaseService<UserBase> {

}

用户信息实现类

@Service("userBaseService")
public class UserBaseServiceImpl extends
BaseServiceImpl<UserBase, IUserBaseDao> implements IUserBaseService {

private Log log = LogFactory.getLog(this.getClass());

@Autowired
@Qualifier("userBaseDao")
private IUserBaseDao userBaseDao;

@Override
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public int add(UserBase user) throws LogicException {
return userBaseDao.insert(user);
}

@Override
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public int delete(UserBase user) throws LogicException {
return userBaseDao.delete(user);
}

@Override
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public int deleteById(int id) throws LogicException {
return userBaseDao.deleteById(id);
}

@Override
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public int update(UserBase user) throws LogicException {
return userBaseDao.update(user);
}

@Override
public UserBase find(int id) throws LogicException {
return userBaseDao.select(id);
}

@Override
public List<UserBase > findAll() throws LogicException {
return userBaseDao.selectAll();
}

@Override
public List<UserBase> findList(UserInfo user) throws LogicException {
return userBaseDao.selectList(user);
}
}

SpringBoot项目启动报错

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. main [36mo.s.boot.SpringApplication

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userBaseServiceImpl': Unsatisfied dependency expressed through field 'userBaseDao'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userBaseDao' defined in file [E:\workspace\system\system-dao-user\target\classes\com\system\dao\user\IUserBaseDao.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:587) ~[spring-beans-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:91) ~[spring-beans-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:373) ~[spring-beans-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanF




百度了网上的做法,让公共基础类IBasicDao继承SqlSessionFactory 这个接口,可以解决这个问题

public interface IBasicDao<T> extends SqlSessionFactory {


这个做之后,项目又报了新的错误

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.

***************************
APPLICATION FAILED TO START
***************************

Description:

file [E:\workspace\system\system-dao\target\classes\com\system\dao\IBasicDao.class] required a single bean, but 3 were found:
- userBaseDao: defined in file [E:\workspace\system\system-dao-user\target\classes\com\system\dao\user\IUserBaseDao.class]
- userInfoDao: defined in file [E:\workspace\system\system-dao-user\target\classes\com\system\dao\user\IUserInfoDao.class]

Action:

Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed


我将注解@Qualifier加到DAO接口,以及Service注入的类上面,SpringBoot项目启动之后,还是报同样的错误



我将注解@Primary分别加到userBaseDao、userInfoDao和接口上面,SpringBoot项目启动之后,报

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2018-06-27 17:33:43.620 ERROR 212 --- [ main] o.s.boot.SpringApplication : Application run failed

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userBaseServiceImpl': Unsatisfied dependency expressed through field 'userBaDao'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userBaseDao' defined in file [E:\workspace\system\system-dao-user\target\classes\com\system\dao\user\IUserDao.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.apache.ibatis.session.SqlSessionFactory' available: more than one 'primary' bean found among candidates: [userInfoDao]



现在这些问题我真是无法解决了,请各位中对SpringBoot和Maven整合比较熟悉的大牛和高人帮忙看看,这个问题如何解决???


...全文
358 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jatham 2018-06-28
  • 打赏
  • 举报
回复
看看你的包名结构是不是一致的
stacksoverflow 2018-06-28
  • 打赏
  • 举报
回复
引用 4 楼 u011013470 的回复:
[quote=引用 1 楼 stacksoverflow 的回复:]
感觉你在第一次报错的时候把sqlSessionFactory配出来就好了,后面越折腾越麻烦。
看看这篇文章
https://my.oschina.net/sluggarddd/blog/751930

做一个MybatisConfig
@Configuration
public class MybatisConfig {
。。。
\


感谢这位兄台,我的问题解决了,但是又出现了新的问题!!!


[/quote]
什么问题?
u011013470 2018-06-28
  • 打赏
  • 举报
回复
引用 1 楼 stacksoverflow 的回复:
感觉你在第一次报错的时候把sqlSessionFactory配出来就好了,后面越折腾越麻烦。
看看这篇文章
https://my.oschina.net/sluggarddd/blog/751930

做一个MybatisConfig
@Configuration
public class MybatisConfig {
。。。
\


感谢这位兄台,我的问题解决了,但是又出现了新的问题!!!


oyljerry 2018-06-27
  • 打赏
  • 举报
回复
不行,就重新新建工程重来
stacksoverflow 2018-06-27
  • 打赏
  • 举报
回复
感觉你在第一次报错的时候把sqlSessionFactory配出来就好了,后面越折腾越麻烦。
看看这篇文章
https://my.oschina.net/sluggarddd/blog/751930

做一个MybatisConfig
@Configuration
public class MybatisConfig {
。。。
内容概要:本文档是2025年全国广播电视技术能手竞赛IPTV专业的竞赛内容大纲,旨在指导参赛选手准备比赛。竞赛分为理论和实操两大部分。理论部分涵盖基本知识、基础理论和专业知识,包括法律法规、技术标准、IPTV技术基础、信号传输与分发、网络和数据安全等。实操部分则涉及IPTV系统设备、仪器设备的操作使用和指标测量。具体内容包括IPTV系统架构、传输技术与指标、设备配置及维护、专业技能如测量工具使用、视音频指标测量、直播点播协议分析、播出网络性能测量、网络安全数据分析以及系统故障排查等。 适合人群:从事或有意从事IPTV相关工作的技术人员,尤其是有志于参加全国广播电视技术能手竞赛的专业人士。 使用场景及目标:①帮助参赛选手全面了解并掌握IPTV相关的法规文件和技术标准;②提升选手对IPTV系统架构、传输技术和设备配置的理解;③增强选手在实际操作的测量、分析和故障排查能力;④确保选手能够熟练运用各种测量工具和分析软件进行视音频指标测量和网络安全数据分析。 阅读建议:由于文档内容详尽且专业性强,建议读者在学习过程结合实际案例和操作练习,同时参考相关技术文献,以便更好地理解和掌握竞赛所需的知识和技能。

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧