1.4emapWS
用于处理webservice的发布。
1.4.1发布的webservice查询地址
[root]/sys/emapWS/list.do
访问以上地址可以查询所有应用已发布的webservice。
1.4.2定义webservice
如果需要将一个类发布成webservice,首先需要将这个类注册到应用的spring中,然后再添加WebService标注。相关标注的说明可查阅如下文档:
http://docs.oracle.com/javaee/6/api/javax/jws/package-summary.html
目前可以使用的只有:WebService、WebMethod、WebParam这3个。
注:WebParam的header和mode暂不支持。
如果你使用的JDK低于1.7,则可以引入emapWS的发布类,里面有这3个标注。另外还有一些公共类型,这些会在后面的规范中提到。
1.4.3webservice定义规范
WebService标注只有设置在可注册到spring中的类上才有效。
默认生成的名称为“应用名_类名”,当然也可以通过WebService标注的name属性来设置名称。
如果是设置的名称,不会在前面自动添加应用名称,这样可以自行定义一些短名称。但必需保证此名称全局唯一,即不能与其他应用中的webservice名称有重复。
被WebService标注的类中,所有公共的非静态方法(不包括Object类中的方法),都会自动发布成webservice中的操作。如果有哪些方法不需要发布,则可在方法上添加WebMethod标注,将exclude属性设置为true。
1.4.4可解析模型的webservice规范
如果需要让设计器能够通过发布的webservice解析模型,那么方法的入参或出参必需符合以下规范。
1.4.4.1入参规范
入参为以下4个参数:
config:QueryConfig
param:POJO or POJO[]
setting:String
userInfo:UserInfo
根据不同的处理情况,可不定义任何参数,也可定义部分参数,没有先后顺序要求。但是,定义的参数名称和类型必须与要求的完全一致。
a.查询的配置参数
参数名称:config
参数类型:QueryConfig
是否可选:是
作用:设置查询的分页,排序等。执行时会将DaoParam中的相关数据填入这个参数。
QueryConfig的结构如下:
pageNumber:Integer,起始页,如果该属性的值为-1表示不需要分页
pageSize:Integer,每页记录数
order:String,排序配置
defaultCondition:boolean,是否需要默认条件(字典表需要判断的属性)
dicType:String,字典表的分类(字典表需要判断的属性)
b.参数对象
参数名称:param
参数类型:POJO对象或POJO数组对象
是否可选:是
作用:设置调用时所需要的参数。设计器会根据此参数解析入参模型。
POJO对象的所有成员可用的类型如下:
int,Integer,long,Long,double,Double,byte[],String,Date
除了POJO类型,还可以设置带ModelInfo标注的Map类型,如:
queryXxx1(@ModelInfo("USER_INFO") Map<String, Object> param) {
…
}
queryXxx2(@ModelInfo("biz:userCondition") Map<String, Object>[] param) {
…
}
ModelInfo标注在com.wisedu.emap.ws包下,里面的值可以直接设置数据模型的名称,如果需要使用业务模型,需要以“biz:”起始。
c.条件的配置
参数名称:setting
参数类型:String
是否可选:是
作用:设置动态的查询条件。执行时会将高级查询生成的querySetting传入这个参数。
动态的查询条件是JSON格式的字符串,具体格式参考“3.7.6”中的“提交条件的数据格式”。
d.用户信息
参数名称:userInfo
参数类型:UserInfo
是否可选:是
作用:获取调用方当前登录的用户信息、所属应用等。
可调用UserInfo.verify(boolean throwInvalid)方法验证用户信息是否有效。
注:验证方法只有在验证字符串正确,且两台服务器的时间相差在5分钟内才会返回true。
另外,还需要注意,带有用户信息参数的WS方法动作将会被判断为需要数据权限的动作。如果这个方法只是需要获取用户信息,并不需要数据权限,那需要再创建一个用户信息对象(可以继承原有的用户信息对象),并在新的用户信息对象中添加一个boolean类型的成员变量,名称为:unrequiredPermission。
1.4.4.2出参规范
结果对象可以继承AbstractResult,并根据需要添加result属性。
结果对象的结构如下:
code:int,状态码,0表示没有错误
msg:String,返回的信息,如出错信息等
logId:String,日志编号,用于查询相关日志的编号
pageNumber:int,起始页
pageSize:int,每页记录数
totalCount:int,总记录数或受影响的记录数,如果没有统计总记录数,此值可以是-1
result:POJO[] or POJO,结果数组,每行为一个POJO对象,所有成员可用的类型同前面的参数对象
注:设计器会根据result属性解析出参模型。
除了继承AbstractResult类型,还可以设置带ModelInfo标注的ModelResult类型,或其继承类型,如:
public @ModelInfo("USER_INFO") ModelResult queryXxx1(…) {
…
}
ModelResult类在com.wisedu.emap.ws包下。
1.4.5webservice的监听
1.4.5.1应用内切面
如果需要对应用内的webservice方法调用进行切面编程,可以实现IServiceAspect接口,并将这个实现类注册到应用的spring中。
如果是注册在父应用中,那么所有子应用都会使用这个切面。如果父应用和子应用都注册了切面,那在子应用中将使用自己的切面。
注:一个应用的spring中只能注册一个实现此接口的对象。如果注册了多个实现此接口的对象,那此应用内的切面将无法生效。
1.4.5.2对所有webservice的监控
如果需要对系统中所有的webservice方法调用进行监控,可以实现IServiceSupervisor接口,并将这个实现类注册到应用的spring中。
然后需要在配置文件emap.properties中的配置项emap.ws.supervisors中注册这个对象,注册样例如下:
emap.ws.supervisors=app1/beanId1,app2/beanId2
应用名称和bean的编号间用“/”分隔,多个监控者之间用“,”分隔,配置列表中的先后顺序即执行时的调用顺序。如果还存在应用内切面,那切面会在最后执行。
配置文件的具体位置及说明见《EMAP运行环境的配置说明》。
另外,调用参数IServiceInfo的process(Object[] args)方法,可以继续执行webservice的调用过程。
还有,如果希望自动将监控对象设置到配置中,而不需要在实施时调整配置,可以在bean的初始化方法中调用下面这段代码:
1.4.6对象成员信息的设置
要设置成员的信息,可以使用FieldInfo标注。
如果WSDL定义中的名称和成员的名称不一致,则可通过此标注的name来设置WSDL中定义的名称。
1.4.6.1字典搜索参数的获取
如果webservice服务作为字典表,那首先需要存在名称为param的参数用于接收字典的搜索条件。之后这个类需要继承AbstractDicSearchInfo,用于接收搜索条件的值。如果无法继承AbstractDicSearchInfo,那可以参考此类的定义,将需要的成员定义到你的类中。
如果只需要接收特定的参数,那也可以直接定义成参数,通过WebParam标注来指定参数名称,样例如下:
public XxxResult getXxxCode(@WebParam(name=AbstractDicSearchInfo.NAME_PREFIX + "pId") String parentId) {
…
}
可接收的参数说明如下:
AbstractDicSearchInfo.NAME_PREFIX + "id",根据字典中的代码值进行全等匹配
AbstractDicSearchInfo.NAME_PREFIX + "name",根据字典中的显示值进行匹配(匹配方式见 mathType)
AbstractDicSearchInfo.NAME_PREFIX + "pId",树型字典有效,对父节点代码值进行全等匹配
AbstractDicSearchInfo.NAME_PREFIX + "matchType",匹配方式
0,根据name参数对显示值进行全等匹配
1,根据name参数对显示值进行模糊匹配
2,根据name参数对代码值或显示值进行模糊匹配
AbstractDicSearchInfo.NAME_PREFIX + "searchValue",格式同高级查询的数据提交格式,用于设置字典对应的表中其它列相关的查询条件
具体说明见“3.7.6”及“3.7.7”。