从Github上fork一个论坛项目,原本数据库用的MySQL,本地项目使用的Oracle。修改过程和出现的几个问题,做一下记录。
1.第一步当然是修改maven的POM依赖,删除MySQL的依赖,加入oracle的依赖。本地maven使用的阿里云的仓库,好像跟maven的中央仓库内容不是很一致,就是中央仓库有的,阿里库里没有。所以注意要跟阿里库一致。
2.改完依赖,编译之后开始尝试启动项目。再启动项目之前,要先在oracle上面创建表空间,创建用户,分配用户在表空间上的各种权限;在启动过程中先后出现:建session权限;建表权限;建序列,查询序列权限;表空间扩展权限等;然后是oracle字段类型与MySQL差异出现的问题,主要是text和varchar2的转换;mysql中可以用date关键字做字段名,oracle中不可以,我统一在后面加了1,变成date1。
3.数据库的问题解决后,hibernate的问题,
No property date found for type RememberMeToken! Did you mean 'date1'?
搜了几个半天没有靠谱的解释,最后点开一个英文的链接,一个外国熊弟给出了原因:修改了字段的属性名后,对应方法里面引用的变量名也要修改。比如本来属性原来是username,有个方法名是deleteByUsername,如果username变成username1了,对应方法也要改为deleteByUsername1.
其实这些规则在JPA的规范里面都有,如果从头学的应该不会掉坑,半道乱入的遇到了就会比较迷惑。
4.第一次登陆没有问题,关掉浏览器再打开就报了空指针异常。堆栈信息里没有定位到项目代码里,真是头皮发麻。没办法硬着头皮找,看到是remeberMe这个功能,项目中使用了spring-security实现了权限控制功能,其中有一个记住我的功能。记录了一个用户token在数据库中,每次登陆根据数据库中存的时间,来判断token是否过期。控制台最后输出一条查询语句,一查发现里面有个date1的字段是空的。有门!打开相关代码一行一行看,找到保存token的service层,用到了spring-beans下的beanUtil.copyProperties方法。是把另外spring-security里一个token对象复制到remeberMeToken这个对象里,点进去一看,tmd,人家里面是date,我这里面是date1,好吧,再加一行代码重新赋值。重启,搞定。