最后
给大家送一个小福利
附高清脑图,高清知识点讲解教程,以及一些面试真题及答案解析。送给需要的提升技术、准备面试跳槽、自身职业规划迷茫的朋友们。
public class MainController {
@GetMapping("hello")
public String hello() {
return "Hello Spring Boot!";
}
}
```
运行项目没有报任何错误,然后在浏览器中访问:localhost:8080/demo/hello,如下: ![在这里插入图片描述](https://img-blog.csdnimg.cn/ad4ef1d6b4ab463191af0eacdc9fbbf2.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAYW5kcm9pZF9jYWlfbmlhbw==,size_15,color_FFFFFF,t_70,g_se,x_16)
如上图,并没有出现我们期待的"Hello Spring Boot!"字符串,控制台也没有出现错误,见鬼了。如果开始创建Spring Boot项目的时候选择了Java语言,就不会有这个问题,开始我还怀疑是Spring Boot不支持Kotlin语言吗?仔细一想也不对啊,创建的时候明明有Kotlin可以选择就说明了是支持Kotlin语言的,后来是一不小心就解决了这个问题的:当我把MainController转换为Kotlin语言后就好了,具体原因不详,Kotlin和Java是可以同时存在的,只能说这是Spring Boot的坑。MainController转换为Kotlin语言如下:
```
@RestController
@RequestMapping("/demo")
class MainController {
@GetMapping("hello")
fun hello(): String {
return "Hello Spring Boot!"
}
}
```
此时我们重新运行项目,并再次访问:localhost:8080/demo/hello,如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/9bd9cba7cf3b4f65b38fc6cc88f88f36.png)
-
Spring Boot的另外一个坑,其实和上面也是同一个坑来的,但是
数据库访问我是完全参考的官方文档:https://spring.io/guides/gs/accessing-data-mysql/
在官方教程中,还有一个User和UserRepository,我也是直接复制过来的,是Java代码,后来把MainController转换为了Kotlin,而User和UserRepository并没有转换为Java,运行时报如下错误:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘mainController’
一开始我还不知道Spring Boot和Kotlin有兼容问题的时候,我就在百度或Google上搜索这个错误信息,文章是有许多的,但是没有一个能解决我的问题的。
完整异常信息如下:
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 2021-09-18 10:04:20.292 ERROR 8820 --- [ main] o.s.boot.SpringApplication : Application run failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mainController' defined in file [C:\Users\Even\Downloads\gs-accessing-data-mysql-main\HelloB\build\classes\kotlin\main\com\example\hellob\MainController.class]: Post-processing of merged bean definition failed; nested exception is java.lang.IllegalStateException: Failed to introspect Class [com.example.hellob.MainController] from ClassLoader [jdk.internal.loader.ClassLoaders$AppClassLoader@2437c6dc] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:579) ~[spring-beans-5.3.9.jar:5.3.9] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:524) ~[spring-beans-5.3.9.jar:5.3.9] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.9.jar:5.3.9] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.9.jar:5.3.9] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.9.jar:5.3.9] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.9.jar:5.3.9] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:944) ~[spring-beans-5.3.9.jar:5.3.9] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) ~[spring-context-5.3.9.jar:5.3.9] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.9.jar:5.3.9] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) ~[spring-boot-2.5.4.jar:2.5.4] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) ~[spring-boot-2.5.4.jar:2.5.4] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:434) ~[spring-boot-2.5.4.jar:2.5.4] at org.springframework.boot.SpringApplication.run(SpringApplication.java:338) ~[spring-boot-2.5.4.jar:2.5.4] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1343) ~[spring-boot-2.5.4.jar:2.5.4] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1332) ~[spring-boot-2.5.4.jar:2.5.4] at com.example.hellob.HelloBApplicationKt.main(HelloBApplication.kt:13) ~[main/:na] Caused by: java.lang.IllegalStateException: Failed to introspect Class [com.example.hellob.MainController] from ClassLoader [jdk.internal.loader.ClassLoaders$AppClassLoader@2437c6dc] at org.springframework.util.ReflectionUtils.getDeclaredFields(ReflectionUtils.java:739) ~[spring-core-5.3.9.jar:5.3.9] at org.springframework.util.ReflectionUtils.doWithLocalFields(ReflectionUtils.java:671) ~[spring-core-5.3.9.jar:5.3.9] at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.buildPersistenceMetadata(PersistenceAnnotationBeanPostProcessor.java:407) ~[spring-orm-5.3.9.jar:5.3.9] at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findPersistenceMetadata(PersistenceAnnotationBeanPostProcessor.java:388) ~[spring-orm-5.3.9.jar:5.3.9] at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessMergedBeanDefinition(PersistenceAnnotationBeanPostProcessor.java:335) ~[spring-orm-5.3.9.jar:5.3.9] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyMergedBeanDefinitionPostProcessors(AbstractAutowireCapableBeanFactory.java:1098) ~[spring-beans-5.3.9.jar:5.3.9] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:576) ~[spring-beans-5.3.9.jar:5.3.9] ... 15 common frames omitted Caused by: java.lang.NoClassDefFoundError: Lcom/example/hellob/UserRepository; at java.base/java.lang.Class.getDeclaredFields0(Native Method) ~[na:na] at java.base/java.lang.Class.privateGetDeclaredFields(Class.java:3061) ~[na:na] at java.base/java.lang.Class.getDeclaredFields(Class.java:2248) ~[na:na] at org.springframework.util.ReflectionUtils.getDeclaredFields(ReflectionUtils.java:734) ~[spring-core-5.3.9.jar:5.3.9] ... 21 common frames omitted Caused by: java.lang.ClassNotFoundException: com.example.hellob.UserRepository at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) ~[na:na] at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[na:na] at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[na:na] ... 25 common frames omitted
后来也是无意中把所有类都转换为Kotlin时发现就正常了,所以,总结就是,在Spring Boot项目中,不要混用Kotlin和Java,不然会出现你意想不到的问题。怪不得我们的后台还没开始使用Kotlin语言来开发,或许这也是原因之一。而在Android上Kotlin和Java就能很好的整合在一起。
========================================================================================
-
创建Spring Boot项目,在选择依赖项的时候添加:Spring Web、Spring Data JPA、MySQL Driver
-
在MySQL中创建好数据库(注:只需要创建好数据库,表可以不建,因为在Spring Boot中可以用代码来创建表)
-
在application.properties中添加数据库连接配置:
spring.jpa.hibernate.ddl-auto=update spring.datasource.url=jdbc:mysql://${MYSQL_HOST:localhost}:3306/db_example spring.datasource.username=springuser spring.datasource.password=ThePassword spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.open-in-view=true #spring.jpa.show-sql: true
-
创建对应数据库表的JavaBean:User
import javax.persistence.Entity import javax.persistence.GeneratedValue import javax.persistence.GenerationType import javax.persistence.Id @Entity class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) var id: Int? = null var name: String? = null var email: String? = null }
-
创建用于操作User表的接口
import org.springframework.data.repository.CrudRepository interface UserRepository : CrudRepository<User?, Int?>
-
创建Controller并使用UserRepository来操作User表的增删改查
Java高频面试专题合集解析:
当然在这还有更多整理总结的Java进阶学习笔记和面试题未展示,其中囊括了Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构资料和完整的Java架构学习进阶导图!
更多Java架构进阶资料展示
多Java架构进阶资料展示**
[外链图片转存中…(img-xonPqW7B-1714869928006)]
[外链图片转存中…(img-kVV7EDEU-1714869928006)]
[外链图片转存中…(img-Y7Ealowh-1714869928006)]