最近刚开始看《Spring Cloud与Docker 微服务架构实战》一书,打算学习点微服务的相关技术,但是我是没有SpringBoot的基础的,所以即便一个最简单的Demo竟然都让我举步维艰,至少踩中了四个坑,所以特此记录下,也给同样刚学的朋友们一点经验。
案例很简单,使用Maven搭建Spring boot项目,编写一个用户服务提供者。
由于我是看着书敲的,自己创建的yml文件,在eclipse中就像编辑最普通的txt文本文档一样艰难,没有任何提示,但我没想到格式会这么严格,不论怎么敲就是报错。
我是怎么解决的?后来我去Spring官网下载了一个Spring Tool Suite插件,http://spring.io/tools/sts/all,安装后再次打开application.yml文件就变为了下面这个样子
有着很明显的颜色区分。但我还是报错,出错的地方在hibernate: ddl-auto: none 那块儿,总是提示写在这里不被允许。我是真的很郁闷,后来才仔细对比下,竟然是空格的问题。
原因就是这样,前面一开始就错了,但在hibernate节点那儿才报错,让我误以为是那块儿出错了。
这哪里有错?嗯?反反复复看了好几遍,我擦,书里是单引号。不会是这个问题吧?(注意看这里的varchar类型数据用双引号包裹是绿色的),于是我又换成了单引号
居然变成了蓝色的了?一运行居然通过了。我的内心是崩溃的,MySQL写双引号或者单引号都是没问题的,所以我潜意识认为这个H2也是可以的....哎,差点让我怀疑人生。
再次提醒,H2数据库varchar类型插入时得用单引号,亲测。。。
@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类要至少和启动类同级,或者在其子包下。
意思是在实体类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。
至此,再次运行项目,终于能够成功访问了。
可以看到,即便一个小例子,如果不够认真细心,还是会出一些错误让你抓狂。当然我这是直接照着书敲,并且没有前置基础,出错也是难免的。不过我还是期待接下来的例子继续出错,暴露出问题来,然后我再解决~哈哈。