spring boot項目搭建中遇到的問題

  本身動手搭建一下spring boot的項目,中途遇到了幾個問題,在這裏記錄一下!java

1、關於數據庫中的表設計的問題git

一、設計表的時候必定要添加的兩個字段created updated 建立時間與更新時間 這兩個字段是必須的
二、數據庫的表字段設計必定要規範,由於若是使用分頁助手的話,你的表字段設計不規範,會存在不少問題
好比:個人book_info 表中的字段 有一個是pubInfo 駝峯命名法,可是其餘的是book_name、img_url 下劃線命名法,形成使用通用mapper以及分頁助手的時候,會形成找不到pub_info
這一列,我猜可能他的插件的內部是使用的下劃線命名法的字段吧,這種東西必定要在設計以前考慮到,規範的是使用下劃線那種命名的方法
...這個是能夠本身設置的。在實體類中用註解的方式來設置table的名稱以及column的名稱,害得我從新設計了一張表,不過,最好約束本身遵照規範github

三、設計數據庫表的字段的時候必定要設置字符集,最好就是通用的utf-8,避免之後數據插入數據庫的時候出現亂碼的問題web

2、項目搭建中問題spring

集成一下通用mapper以及分頁助手以及數據池,優化一下數據庫鏈接訪問,通用mapper以及分頁助手能夠簡化不少代碼,提升開發效率數據庫

一、分頁助手的版本問題springboot

正確的maven中的依賴各個版本號:mybatis

 1     <!--通用mapper -->
 2     <dependency>
 3         <groupId>tk.mybatis</groupId>
 4         <artifactId>mapper-spring-boot-starter</artifactId>
 5         <version>1.1.0</version>
 6     </dependency>
 7     <!--pagehelper分頁助手 -->
 8     <dependency>
 9         <groupId>com.github.pagehelper</groupId>
10         <artifactId>pagehelper-spring-boot-starter</artifactId>
11         <version>1.2.10</version>
12     </dependency>
13     <!--阿里巴巴數據源 -->
14     <dependency>
15         <groupId>com.alibaba</groupId>
16         <artifactId>druid</artifactId>
17         <version>1.0.25</version>
18     </dependency>

這裏面須要注意的是分頁助手,這個以前用的是1.1.0,可是和最新的2.1.7的springboot整合的時候回報錯,重現了一下錯誤信息:app

 1 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.github.pagehelper.autoconfigure.PageHelperAutoConfiguration': Post-processing of merged bean definition failed; nested exception is java.lang.IllegalStateException: Failed to introspect Class [com.github.pagehelper.autoconfigure.PageHelperAutoConfiguration] from ClassLoader [sun.misc.Launcher$AppClassLoader@18b4aac2]
 2     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:570)
 3     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515)
 4     at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
 5     at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
 6     at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
 7     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
 8     at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:845)
 9     at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:877)
10     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549)
11     at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)
12     at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:743)
13     at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:390)
14     at org.springframework.boot.SpringApplication.run(SpringApplication.java:312)
15     at org.springframework.boot.SpringApplication.run(SpringApplication.java:1214)
16     at org.springframework.boot.SpringApplication.run(SpringApplication.java:1203)
17     at com.example.demo.web.DemoWebApplication.main(DemoWebApplication.java:18)
18 Caused by: java.lang.IllegalStateException: Failed to introspect Class [com.github.pagehelper.autoconfigure.PageHelperAutoConfiguration] from ClassLoader [sun.misc.Launcher$AppClassLoader@18b4aac2]
19     at org.springframework.util.ReflectionUtils.getDeclaredFields(ReflectionUtils.java:760)
20     at org.springframework.util.ReflectionUtils.doWithLocalFields(ReflectionUtils.java:692)
21     at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.buildResourceMetadata(CommonAnnotationBeanPostProcessor.java:365)
22     at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.findResourceMetadata(CommonAnnotationBeanPostProcessor.java:350)
23     at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessMergedBeanDefinition(CommonAnnotationBeanPostProcessor.java:298)
24     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyMergedBeanDefinitionPostProcessors(AbstractAutowireCapableBeanFactory.java:1077)
25     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:567)
26     ... 15 common frames omitted
27 Caused by: java.lang.NoClassDefFoundError: Lorg/springframework/boot/bind/RelaxedPropertyResolver;
28     at java.lang.Class.getDeclaredFields0(Native Method)
29     at java.lang.Class.privateGetDeclaredFields(Class.java:2583)
30     at java.lang.Class.getDeclaredFields(Class.java:1916)
31     at org.springframework.util.ReflectionUtils.getDeclaredFields(ReflectionUtils.java:755)
32     ... 21 common frames omitted
33 Caused by: java.lang.ClassNotFoundException: org.springframework.boot.bind.RelaxedPropertyResolver
34     at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
35     at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
36     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)
37     at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
38     ... 25 common frames omitted

看這個錯誤信息好像是和AppClassLoader有關的,類加載器加載不到所須要的RelaxedPropertyResolver類,具體內部是怎麼解決這個問題的,也不知道,經過網上求救是換jar的版本換成1.2.10的版本就OK了maven

二、application.properties文件中的配置中的問題

這裏的問題主要是通用mapper的問題:先看一下正確的配置

1 # 通用mapper配置
2 mapper.mappers=com.example.demo.dao.BaseMapper
3 mapper.not-empty=false
4 mapper.identity=MYSQL

這裏面有一個配置須要注意:mapper.mappers 這個配置,這個配置是須要配置你寫的那個基礎的mapper類的全路徑的BaseMapper的代碼:

1 /**
2  * @program: demo
3  * @description: 基礎的mapper
4  * @author: ssc
5  * @create: 2019/8/20 10:21
6  **/
7 public interface BaseMapper<T> extends Mapper<T>,MySqlMapper<T>{
8 
9 }

這個若是沒有配置正確的話,啓動的時候也會報錯的,具體的報錯信息:

1 Description:
2 Failed to bind properties under 'mapper.mappers' to java.util.List<java.lang.Class<?>>:
3     Reason: No converter found capable of converting from type [java.lang.String] to type [java.util.List<java.lang.Class<?>>]

補充一下:這裏還有一個問題,就是BaseMapper能和業務中的mapper類放到一個包中的問題,這個尚未驗證,反正如今是不放到一個包中是沒有問題的

TODO:這個明天驗證一下
2019年8月21日09:46:30 今天來驗證一下這個,這個好像是不行的,由於在啓動類中加入了@MapperScan("com.example.demo.dao.mapper")註解,不能讓啓動類掃描到這個BaseMapper不能放到和@MapperScan註解的同一個包下面,否則會報錯,建立失敗

 1 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.github.pagehelper.autoconfigure.MapperAutoConfiguration': Invocation of init method failed; nested exception is java.lang.RuntimeException: java.lang.RuntimeException: java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class
 2     at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:139)
 3     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:414)
 4     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1770)
 5     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593)
 6     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515)
 7     at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
 8     at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
 9     at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
10     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
11     at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:845)
12     at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:877)
13     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549)
14     at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)
15     at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:743)
16     at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:390)
17     at org.springframework.boot.SpringApplication.run(SpringApplication.java:312)
18     at org.springframework.boot.SpringApplication.run(SpringApplication.java:1214)
19     at org.springframework.boot.SpringApplication.run(SpringApplication.java:1203)
20     at com.example.demo.web.DemoWebApplication.main(DemoWebApplication.java:18)
21 Caused by: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class
22     at tk.mybatis.mapper.mapperhelper.MapperHelper.setSqlSource(MapperHelper.java:247)
23     at tk.mybatis.mapper.mapperhelper.MapperHelper.processConfiguration(MapperHelper.java:310)
24     at tk.mybatis.mapper.mapperhelper.MapperHelper.processConfiguration(MapperHelper.java:289)
25     at com.github.pagehelper.autoconfigure.MapperAutoConfiguration.addPageInterceptor(MapperAutoConfiguration.java:69)
26     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
27     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
28     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
29     at java.lang.reflect.Method.invoke(Method.java:498)
30     at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:363)
31     at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:307)
32     at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:136)
33     ... 18 common frames omitted
34 Caused by: java.lang.RuntimeException: java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class
35     at tk.mybatis.mapper.mapperhelper.MapperTemplate.setSqlSource(MapperTemplate.java:246)
36     at tk.mybatis.mapper.mapperhelper.MapperHelper.setSqlSource(MapperHelper.java:244)
37     ... 28 common frames omitted
38 Caused by: java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class
39     at tk.mybatis.mapper.mapperhelper.MapperTemplate.getEntityClass(MapperTemplate.java:278)
40     at tk.mybatis.mapper.provider.base.BaseSelectProvider.selectCount(BaseSelectProvider.java:111)
41     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
42     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
43     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
44     at java.lang.reflect.Method.invoke(Method.java:498)
45     at tk.mybatis.mapper.mapperhelper.MapperTemplate.setSqlSource(MapperTemplate.java:234)
46     ... 29 common frames omitted

三、實體類與數據庫表對應的問題

這個就是一些字段與實體類的屬性,以及表名稱與類名稱的對應的問題了,這個也是很噁心的,仍是不是很熟悉,因此老是報錯,在建立實體類的時候,最好在類名上加上@Table(name="表名稱")以及在屬性上加上@Column(name="字段名稱")這樣的註解,以防範出現對應錯誤

四、BaseService封裝的問題

先看一下錯誤信息:

 1 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'bookController': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'bookService': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'tk.mybatis.mapper.common.Mapper<?>' available: expected single matching bean but found 2: bookInfoMapper,bookMapper
 2     at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessProperties(CommonAnnotationBeanPostProcessor.java:324)
 3     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1411)
 4     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:592)
 5     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515)
 6     at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
 7     at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
 8     at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
 9     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
10     at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:845)
11     at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:877)
12     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549)
13     at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)
14     at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:743)
15     at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:390)
16     at org.springframework.boot.SpringApplication.run(SpringApplication.java:312)
17     at org.springframework.boot.SpringApplication.run(SpringApplication.java:1214)
18     at org.springframework.boot.SpringApplication.run(SpringApplication.java:1203)
19     at com.example.demo.web.DemoWebApplication.main(DemoWebApplication.java:18)
20 Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'bookService': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'tk.mybatis.mapper.common.Mapper<?>' available: expected single matching bean but found 2: bookInfoMapper,bookMapper
21     at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessProperties(CommonAnnotationBeanPostProcessor.java:324)
22     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1411)
23     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:592)
24     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515)
25     at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
26     at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
27     at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
28     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:204)
29     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.resolveBeanByName(AbstractAutowireCapableBeanFactory.java:452)
30     at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:526)
31     at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:496)
32     at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:636)
33     at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:180)
34     at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:90)
35     at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessProperties(CommonAnnotationBeanPostProcessor.java:321)
36     ... 17 common frames omitted
37 Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'tk.mybatis.mapper.common.Mapper<?>' available: expected single matching bean but found 2: bookInfoMapper,bookMapper
38     at org.springframework.beans.factory.config.DependencyDescriptor.resolveNotUnique(DependencyDescriptor.java:221)
39     at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1229)
40     at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1171)
41     at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:520)
42     at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:496)
43     at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:636)
44     at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:180)
45     at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:90)
46     at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessProperties(CommonAnnotationBeanPostProcessor.java:321)
47     ... 31 common frames omitted

這個錯誤的根本緣由是在封裝的通用的service中,由於也就是BaseService這個類,開始寫的是使用的
@Autowired
private Mapper<T> mapper;

爲啥這樣寫就會出現那個錯誤呢 ?分析一下能夠知道,當一個新建立的service層的類繼承BaseService的時候,BaseService須要自動注入Mapper類,可是這時候Mapper發現spring容器中有多個類實現了Mapper,究竟是用哪個實現類呢,他本身搞不清楚,因而就拋出異常了,找到了多個實現類,如今記不清以前如何解決這個問題的,可是能夠退一步,不要在BaseService中自動注入Mapper類我就明確告訴你,你須要實現那個Mapper類型的class。

具體的解決方法是:

我建立一個抽象的方法,子類繼承個人時候須要給我一個具體的實現類
public abstract Mapper<T> getMapper();

例如:子類BookService 直接把你實現的BookMapper給了父類就好了,這樣就不會有那個,不知道實現哪一個子類的狀況了:

 1 @Service
 2 public class BookService extends BaseService<BookInfo>{
 3 
 4     private Logger logger = LoggerFactory.getLogger(BookService.class);
 5 
 6     @Autowired
 7     private BookMapper bookMapper;
 8 
 9     @Override
10     public Mapper<BookInfo> getMapper() {
11         return bookMapper;
12     }
13 }
相關文章
相關標籤/搜索