发表于: 2016-12-15 20:55:05
2 1936
今天完成的事情:
1)任务9 service端调试ok
2)任务9 web端调试ok
3)任务9 service端部署虚拟机,使用本机web端连接成功,接口之间调用没有出现问题
明天计划的事情:
1)部署两台service在虚拟机,使用本机一台web端随机连两台service
2)部署两台service在虚拟机,使用本机两台web端在nginx分配下随机连两台service
3)给任务9 多加个联表查询
遇到的问题:
1)如昨天日报所讲,任务9的service端向外暴露接口,启动后,客户端拿到的是个空的接口
原因分析:因为service端使用了tuscany的.composite配置,其中用于引用spring bean的配置(implementation.spring)加载出错,并且无法解决
报错信息:Element {http://www.osoa.org/xmlns/sca/1.0}implementation.spring cannot be processed
解决办法:
绕过这个配置,仍然使用implementation.java进行配置
但是,在spring+myBatis下,UserServiceImpl中引用的dao对象是没有初始化过的,必须要经过spring的注入后才能初始化,那么怎样才能引用到初始化过后的UserServiceImpl呢?采取了一种办法,取消dao的注入,直接在UserServiceImpl的构造方法中对它进行初始化
但是,这个dao还是没有初始化啊,这里我采用了直接从spring容器中拿bean的方式,在spring配置文件中定义一个工厂方法(间谍),它可以给我们提供spring容器初始化后的所有信息
这个工具类是这样写的,实现BeanFactoryAware接口,根据beanName返回所需要的bean
2)解决上一个问题后,启动service端以后,自己写一个main方法去连,可以获得接口,并利用接口调取数据,我们在web端的spring配置文件中配置了一个SCDAomain的bean来进行接口的获取,在controller里写了个set方法
但是,使用web端连接时,尝试访问有数据请求的页面,报错
java.lang.NullPointerException:at jnshu.user.restcontroller.LoginController.loginidentify
(LoginController.java:65)
原因分析:
从报错看,在65行验证密码获得user对象阶段,报空指针,说明我们得到的这个接口还是空的,但我们用main方法手动去连,接口并不是空的
想了半天,突然想起,set方法应该是不可以自动跑的,它又不是构造方法,好蠢
解决办法:见3)
3)将接口的初始化写在controller类的构造方法中
但是在spring容器加载过程中就报了空指针,查看位置,是在构造方法中报的
原因分析:猜测,当spring容器启动,我们在web端的controller类实例化与SCADomain类实例化是存在先后顺序的,如果SCADomain初始化顺序落后于controller的初始化,自然就会报空指针了
解决办法:貌似有个@order(n)是可以控制bean的加载顺序的,但是SCADomain是tuscany框架中的类,我们没有办法去加@order定义,思来想去没有办法,我就把这个employmentService的初始化写在方法体中了,嗯,,真是个偷懒的办法,,因为实在没办法啊
收获:
感觉跨过一座大山
感觉身体被掏空
将本机数据库迁徙到虚拟机
mysql>use lesson;
mysql>source lesson.sql;
评论