一个简单的SpringCloud demo踩中的四处坑

    最近刚开始看《Spring Cloud与Docker 微服务架构实战》一书,打算学习点微服务的相关技术,但是我是没有SpringBoot的基础的,所以即便一个最简单的Demo竟然都让我举步维艰,至少踩中了四个坑,所以特此记录下,也给同样刚学的朋友们一点经验。

    案例很简单,使用Maven搭建Spring boot项目,编写一个用户服务提供者。

    首先第一个坑就是,application.yml配置文件的问题。

    由于我是看着书敲的,自己创建的yml文件,在eclipse中就像编辑最普通的txt文本文档一样艰难,没有任何提示,但我没想到格式会这么严格,不论怎么敲就是报错。

    我是怎么解决的?后来我去Spring官网下载了一个Spring Tool Suite插件,http://spring.io/tools/sts/all,安装后再次打开application.yml文件就变为了下面这个样子

一个简单的SpringCloud demo踩中的四处坑_第1张图片

有着很明显的颜色区分。但我还是报错,出错的地方在hibernate: ddl-auto: none 那块儿,总是提示写在这里不被允许。我是真的很郁闷,后来才仔细对比下,竟然是空格的问题。

一个简单的SpringCloud demo踩中的四处坑_第2张图片

原因就是这样,前面一开始就错了,但在hibernate节点那儿才报错,让我误以为是那块儿出错了。

第二坑,H2数据库插入数据时显示未找到列

     当我解决了配置问题,满心欢喜的运行起项目时,啊哦,这系统又给我抛出了个异常。

这特么又是什么错误?说找不到列?难道是我插入数据时写错了?

这哪里有错?嗯?反反复复看了好几遍,我擦,书里是单引号。不会是这个问题吧?(注意看这里的varchar类型数据用双引号包裹是绿色的),于是我又换成了单引号


居然变成了蓝色的了?一运行居然通过了。我的内心是崩溃的,MySQL写双引号或者单引号都是没问题的,所以我潜意识认为这个H2也是可以的....哎,差点让我怀疑人生。

再次提醒,H2数据库varchar类型插入时得用单引号,亲测。。。

第三坑,方法路径没问题,项目启动就是顽强的404

    解决了配置文件、解决了数据库的语句问题,我想这个可以愉快的运行项目显示我想要的结果了吧。但是又给了我一个霹雳,无限404。
    我的Controller方法里肯定是没啥问题的,就是get方式传个参数,应该就能返回User的JSON字符串信息了。

一个简单的SpringCloud demo踩中的四处坑_第3张图片

@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包就不是同级的了。

一个简单的SpringCloud demo踩中的四处坑_第4张图片

    于是最终我将启动类所在的包调整为com.microservice,让controller包变为和启动类同级。

   一个简单的SpringCloud demo踩中的四处坑_第5张图片

    于是问题终于解决了。所以这里提醒下,最好将这个启动类放到更顶级的目录下,Controller类要至少和启动类同级,或者在其子包下。

第四坑,注解问题导致org.Hibernate.AnnotationException

     一个简单的SpringCloud demo踩中的四处坑_第6张图片

意思是在实体类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注解。

一个简单的SpringCloud demo踩中的四处坑_第7张图片

    由于这里使用的是JPA+H2数据库进行快速搭建的例子,所以应当引用JPA中的注解。

   一个简单的SpringCloud demo踩中的四处坑_第8张图片

    也就是最终应当引用persistence包中的注解@Id。

一个简单的SpringCloud demo踩中的四处坑_第9张图片

    至此,再次运行项目,终于能够成功访问了。

一个简单的SpringCloud demo踩中的四处坑_第10张图片    

    可以看到,即便一个小例子,如果不够认真细心,还是会出一些错误让你抓狂。当然我这是直接照着书敲,并且没有前置基础,出错也是难免的。不过我还是期待接下来的例子继续出错,暴露出问题来,然后我再解决~哈哈。

    

你可能感兴趣的:(微服务,山雨欲来,BUG回忆录)