springcloud使用感受(一个简单的SpringClouddemo踩中的四处坑)
springcloud使用感受(一个简单的SpringClouddemo踩中的四处坑)居然变成了蓝色的了?一运行居然通过了。我的内心是崩溃的,MySQL写双引号或者单引号都是没问题的,所以我潜意识认为这个H2也是可以的....哎,差点让我怀疑人生。这哪里有错?嗯?反反复复看了好几遍,我擦,书里是单引号。不会是这个问题吧?(注意看这里的varchar类型数据用双引号包裹是绿色的),于是我又换成了单引号原因就是这样,前面一开始就错了,但在hibernate节点那儿才报错,让我误以为是那块儿出错了。 当我解决了配置问题,满心欢喜的运行起项目时,啊哦,这系统又给我抛出了个异常。这特么又是什么错误?说找不到列?难道是我插入数据时写错了?
案例很简单,使用Maven搭建Spring boot项目,编写一个用户服务提供者。
首先第一个坑就是,application.yml配置文件的问题。由于我是看着书敲的,自己创建的yml文件,在eclipse中就像编辑最普通的txt文本文档一样艰难,没有任何提示,但我没想到格式会这么严格,不论怎么敲就是报错。
我是怎么解决的?后来我去Spring官网下载了一个Spring Tool Suite插件,http://spring.io/tools/sts/all,安装后再次打开application.yml文件就变为了下面这个样子
有着很明显的颜色区分。但我还是报错,出错的地方在hibernate: ddl-auto: none 那块儿,总是提示写在这里不被允许。我是真的很郁闷,后来才仔细对比下,竟然是空格的问题。
原因就是这样,前面一开始就错了,但在hibernate节点那儿才报错,让我误以为是那块儿出错了。
第二坑,H2数据库插入数据时显示未找到列当我解决了配置问题,满心欢喜的运行起项目时,啊哦,这系统又给我抛出了个异常。
这特么又是什么错误?说找不到列?难道是我插入数据时写错了?
这哪里有错?嗯?反反复复看了好几遍,我擦,书里是单引号。不会是这个问题吧?(注意看这里的varchar类型数据用双引号包裹是绿色的),于是我又换成了单引号
居然变成了蓝色的了?一运行居然通过了。我的内心是崩溃的,MySQL写双引号或者单引号都是没问题的,所以我潜意识认为这个H2也是可以的....哎,差点让我怀疑人生。
再次提醒,H2数据库varchar类型插入时得用单引号,亲测。。。
第三坑,方法路径没问题,项目启动就是顽强的404解决了配置文件、解决了数据库的语句问题,我想这个可以愉快的运行项目显示我想要的结果了吧。但是又给了我一个霹雳,无限404。
我的Controller方法里肯定是没啥问题的,就是get方式传个参数,应该就能返回User的JSON字符串信息了。
- @RestController
- public class UserController {
- @Autowired
- private UserRepository userRepository;
- @GetMapping("/{id}")
- public User getUserByID(@PathVariable Long id){
- User user = userRepository.findOne(id);
- return user;
- }
- }
所以肯定不是路径的问题,于是我就去百度了一下,发现这个启动类和Controller的位置貌似有点要求。注意
,一开始我的启动类是写在com.microservice.main包里的,而Controller是写在com.microservice.controller包里的,这两个包是同级的,但是启动类和这个controller包就不是同级的了。
于是最终我将启动类所在的包调整为com.microservice,让controller包变为和启动类同级。
于是问题终于解决了。所以这里提醒下,最好将这个启动类放到更顶级的目录下,Controller类要至少和启动类同级,或者在其子包下。
第四坑,注解问题导致org.Hibernate.AnnotationException意思是在实体类User中没有定义主键。可是我打开User类一看,明明就使用了@Id注解了啊
- @Entity
- public class User {
- @Id
- @GeneratedValue(strategy = GenerationType.AUTO)
- private Long id;
- @Column
- private String username;
- @Column
- private String name;
- @Column
- private Integer age;
- @Column
- private BigDecimal balance;
- ........//getter与setter
- }
于是纳闷了一会儿,看了看是不是包有问题,是不是有多个@Id注解但是我没导入正确呢?果不其然,原来我引用的竟然是spring data包里的@Id注解。
由于这里使用的是JPA H2数据库进行快速搭建的例子,所以应当引用JPA中的注解。
也就是最终应当引用persistence包中的注解@Id。
至此,再次运行项目,终于能够成功访问了。
可以看到,即便一个小例子,如果不够认真细心,还是会出一些错误让你抓狂。当然我这是直接照着书敲,并且没有前置基础,出错也是难免的。不过我还是期待接下来的例子继续出错,暴露出问题来,然后我再解决