一、配环境真是个头疼的事,
前记:Boot2Docker 是个过时的东西,但是我不知道为什么这次就不想用最新的了,付出惨重代价,所有问题找到的解决方法什么的,都是Docker的。
接下来简单说一下 Boot2Docker,Docker Toolbox, Docker for Windows 三者在win系统上的区别:
Boot2Docker:过时的东西,已经被 Docker Toolbox, Docker for Windows 所包含。
Docker Toolbox:带ce版本是为win10开发的,别的是给win7,win8的。
Docker for Windows:是给win10专业版及以上的。
镜像:
Docker Toolbox 请确认你的 Docker Toolbox 已经启动,并执行下列命令(请将 加速地址 替换为在加速器页面获取的专属地址,也可以是别的镜像地址 )
docker-machine ssh default
sudo sed -i "s|EXTRA_ARGS='|EXTRA_ARGS='--registry-mirror=加速地址 |g" /var/lib/boot2docker/profile
exit
docker-machine restart default
别的系统,参考 Docker 加速器
二、在书的8.2.3章中,需要添加名为root用户。由于对Oracle数据库的不了解,对暴露的接口不是很了解,去管理员界面添加用户,成功添加却还是无法连接成功;换成用数据库管理工具添加,又尝试了好几种数据库管理工具,最后使用 Oracle自己开发的"developer.exe"最为简单的连接上数据库并创建root用户,期间有一些权限之类的问题,看一眼console,直接Google一下都能快速解决。
三、还是在书的8.2.3章中,其中有一个操作是分页,输入链接后会报错,看了一下console,提示" ORA-00933: SQL 命令未正确结束"。找到其中的sql语句,如下
Hibernate:
select person0_.id as id1_0_, person0_.address as address2_0_, person0_.age as age3_0_, person0_.name as name4_0_
from person person0_
where 1=1
fetch first ? rows only
这个语句在Oracle教程中也有提及,本身没有什么错误,但是偶然间发现"fetch first ? rows only"这种表述只能在Oracle12c中引入的,而程序使用的数据库镜像为"oracle-xe-11"。恰巧当时我的docker因不知为何无法分配IP(这个问题好像在Docker Toolbox中无解)而无法使用,于是就下了"Oracle-XE-11"数据库,在操作时,发现分页操作可以正确完成,找到其中的sql语句,如下
Hibernate:
select person0_.id as id1_0_, person0_.address as address2_0_, person0_.age as age3_0_, person0_.name as name4_0_
from person person0_
where person0_.name=? and person0_.address=?
但是在后来的自定义Repository中,涉及分页的内容,仍提示"ORA-00933: SQL 命令未正确结束",找了很久不知道JPA是如何进行版本判别和分析还原语句的。在师兄的建议下,改投MySQL,我只能说切换数据库的代价很小,只需要修改项目中的"application.properties"配置文件就行。
四、还是书的8.2.3章中,在构建"CustomRepositoryFactoryBean"类的时候,会报错
There is no default constructor available in 'org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean'
由于版本问题,加上构造方法就好了
CustomRepositoryFactoryBean(Class extends T> repositoryInterface){
super(repositoryInterface);
}
五、在书的8.3.3章中,用"spring.data.rest.base-path=/api"修改REST的根路径不知道为什么不起作用。
六,在书的8.5.3章中,构建业务服务的实现类的"remove","findOne"方法由于版本的更新,都需要进行相应的改变,由
@Override
@CacheEvict(value = "peopele") //2
public void remove(Long id) {
System.out.println("删除了id、key为"+id+"的数据缓存");
personRepository.delete(id);
}
@Override
@Cacheable(value="people",key="#person.id") //3
public Person findOne(Person person) {
Peson p = personRepository.findOne(person.getId());
System.out.println("为id、key为:"+p.getId()+"数据做了缓存");
return p;
}
改为
@Override
@CacheEvict(value = "peopele") //2
public void remove(Long id) {
System.out.println("删除了id、key为"+id+"的数据缓存");
personRepository.deleteById(id);
}
@Override
@Cacheable(value="people",key="#person.id") //3
public Person findOne(Person person) {
Person p = person;
Optional personOptional = personRepository.findById(person.getId());
System.out.println("为id、key为:"+p.getId()+"数据做了缓存");
return personOptional.get();
}
七,在书的9.1章中,有一些涉及版本和路径拦截方面的问题,一个是在密码前要加入其加密的方式,另一个是需要修改其需要认证的路径匹配及重新添加对资源文件的无须认证方法。