Rest接口
-
NCC项目中Rest接口符合restful规范,接口实现的调用与VO的参数传递都会涉及到代理与反射。
-
开发过程:
-
寻找接口:ncc的结构是基于模块module,不同模块在系统的运行过程中,负责不同的功能,针对需要开发的功能的不同,所需要再开发的模块也不一样,所以开发的首要就是需要去找到需要开发的模块,与其中的接口。例如对基础信息模块中进行增删查改操作,就需要在
ncchome\modules
目录下找到uapbd文件夹,其中封装着基础信息模块中的jar包、配置文件等。寻找接口:接口在模块中是以jar包的形式存在与模块文件夹下的lib目录下,可以根据数据字典中对应的名字去寻找,但这样的方法也只是具有参考性,需要的更多的是经验。就比如
项目基础信息
封装在pubuapbd_pmbase.jar
中,单凭名字来说其实也没有什么参考意义…找到jar包后,需要去解压jar,然后根据其中的目录寻找相应的Service类,打开Service的java文件,其中也会有注释,根据注释信息去找到相应的接口类。
-
调用接口:NCC已经封装好了一套调用Rest接口的一套方法。需要将寻找到的接口的Class对象注入到其中,之后会自动寻找匹配到合适对应接口实现类并注入。
获得接口实现类对象后就需要根据参数,来创建VO类并对其传值:
-
普通传值:
vo.setProject_name(jsonObject.getString("project_name")); vo.setPk_group(jsonObject.getString("pk_group")); vo.setPk_org(jsonObject.getString("pk_org")); vo.setProject_code(jsonObject.getString("project_code")); vo.setPk_eps(jsonObject.getString("pk_eps")); vo.setPlan_start_date(new UFDate(jsonObject.getDate("plan_start_date"))); vo.setPlan_finish_date(new UFDate(jsonObject.getDate("plan_finish_date"))); vo.setEnablestate(jsonObject.getInteger("enablestate"));
-
Stream流式传值:
Consumer<String> consumer = s -> {vo.setAttributeValue(s,jsonObject.get(s));}; jsonObject.keySet().stream().forEach(consumer);
流式传值的方式比起普通传值来说,就不需要书写太多的set方法,因为VO类的父类SuperVO中封装着setAttributeValue方法,它可以根据数据库中的对应字段名来对其进行属性注入,会方便许多。
但无论哪种传值方式,在系统的对接中都需要对字段属性的对应进行修改匹配。
-
-
环境类加载:在NCC中开发Rest接口必须要根据规范继承Resource资源类,并重写其中的getModule方法,返回模块名字符串。
@Path("service/restuapbd") public class TestRestResource extends AbstractUAPRestResource { @Override public String getModule() { return "uapbd"; } @POST @Path("insert") @Produces("application/json") @Consumes("application/json")
之后就可以自定义请求路径在其中编写请求方法。
-
资源类注册(rest配置文件):rest接口开发需要编写配置文件至
META-INF
文件夹中,文件以.rest
为后缀,其中内容格式为xml格式,并需要在其中配置Resource资源类全类名。<?xml version="1.0" encoding='gb2312'?> <module> <rest> <resource classname="nc.cloud.rest.nc.cloud.rest.pub.TestRestResource" exinfo=""/> </rest> </module>
-
-
注意事项:在使用和调试Rest接口的过程中,会出现各类的问题,一般都需要打断点来去查看堆栈信息来找到报错原因,主要原因是AbstractUAPRestResource其子类在被实例化调用的时候都是通过代理进行反射来调用的,在某些节点可以清晰的看到堆栈中的CDLIB包下的对象。所以处理报错信息出了仔细看注解、引用类路径外,还需要打断点仔细跟踪。
插件开发
- 插件开发指的是,在NCC系统操作后根据操作时序进行的二次操作,例如一个表数据的添加操作,就可以在添加前、添加后开发插件,实现操作的拓展。
找到事件源后就可以去新增插件。
-
IBusinessListener:IBusinessListener是插件开发需要去实现的一个接口,其中主要采用的就是观察者模式,去监听事件源,事件源被触发后,就会去事件源id去寻找IBusinessListener的实现类,这些数据都存储在数据库一个表中。
-
接口实现:
public interface IBusinessListener { void doAction(IBusinessEvent var1) throws BusinessException; }
实现该接口后需要重写doAction方法,当监听到事件源时,会将实现类注入并调用doAction方法,实现相应的操作。
接口是否被调用可以通过打断点的方式来跟踪,使用System.out.print的方式并不会直接输出在控制台中。
模块注册
若是ncc中现有的模块不能满足用户的需求,需要重新开发新模块实现功能,就需要去注册并发布模块,其中比较重要的就是文件结构、module.xml配置文件。
-
文件结构🗄:一个模块若是想要去参与到系统的运行,就需要有规范的文件目录结构被识别出来。模块文件必不可少的目录是
META-INF
,其中会存放各类配置文件,比如接口文件、module.xml,另外的文件夹中都存放了各类文件,lib下存放了编译的class文件或jar包。 -
module.xml:它是决定一个模块能否被正确执行的关键所在
<?xml version="1.0" encoding="gb2312"?> <module name="module_name"> <public> </public> <private> </private> </module>
module标签中的name属性对应模块名。
一个模块能否被正确注册可以在sysConfig.bat
path=home\bin\sysConfig.bat
的部署
配置中查看。