时隔十几天对上一篇的补充
消息通道中如何自定义拦截器
spring-integration 中 interface ChannelInterceptor, 注释为 interface for interceptors that are able to view and/or modify the Messages being sent-to and/or received-from a MessageChannel.
所以自定义只需要实现这个接口。然后添加到channel中。
public class SzdPermissionInterceptor implements ChannelInterceptor
自定义xml
自定义xml流程
xsd文件以及例子xml文件在帖子末尾。
1.自定义xsd文件
在resource资源目录下定义xxx.xsd文件,模板例子
<xs:element name="field" type="fieldType">
<xs:annotation>
<xs:documentation>
数据协议字段
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:complexType name="fieldType">
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="type" type="xs:string" use="required" />
<xs:attribute name="length" type="xs:integer" use="optional" />
</xs:complexType>
2.spring上下文加载xsd文件
resource下创建META-INF文件夹,在文件夹下创建spring.hanlders与spring.schemas文件
spring.hanlders 定义解析器
http\://com.dahua/schema/accessData/protocol=com.dahua.paas.fdau.application.init.xml.AccessDataProtocolNamespaceHandler
AccessDataProtocolNamespaceHandler
public class AccessDataProtocolNamespaceHandler extends NamespaceHandlerSupport{
@Override
public void init() {
// 注册接入数据协议映射解析器
registerBeanDefinitionParser("protocol", new AccessDataProtocolMapperParser());
}
}
spring.schemas定义xml文件位置
http\://com.dahua/schema/accessData/protocol/fdau-protocol.xsd=META-INF/fdau-protocol.xsd
NamespaceHandlerSupport类是一个实现了NamespaceHandler接口的抽象类,它提供了方便的方法来处理命名空间和元素的注册和解析。
命名空间和元素注册解析,划重点。
springboot自定义xml标签的时候都需要用到这个接口,写好xsd自定义文件,然后就是spring上下文加载进来xsd定义,以及自定义xml文件。通过NamespaceHandler的parse去处理解析自定义xml文件。其实实现NamespaceHandler的还有spring默认的读取xml,可以自行研究。
init()方法:在此方法中,你可以将命名空间与处理该命名空间的BeanDefinitionParser关联起来,并注册到Spring上下文中。
registerBeanDefinitionParser(String elementName, BeanDefinitionParser parser)方法:该方法用于将元素名与相应的BeanDefinitionParser关联起来。当Spring解析到指定的元素时,会使用相应的BeanDefinitionParser进行解析和创建BeanDefinition。
所以代码中解析的是xsd的protocol标签
还有个registerBeanDefinitionDecorator(String elementName, BeanDefinitionDecorator decorator), 这个没研究,从文档和实现看像是装饰器。
3.标签解析
integrationNamespaceUtils.setValueIfAttributeDefined(builder, element, “namespace”)是一个Spring Integration框架提供的辅助方法,用于根据XML元素的属性值设置BeanDefinitionBuilder对象的属性。
BeanDefinitionBuilder 是BeanDefinition的构造器,BeanDefinition描述Bean的各种元数据,包括Bean的类型、作用域、属性值等。它是Spring容器在进行Bean实例化和管理时使用的配置信息。
这个可以看看源码,实现BeanDefinition的抽象类AbstractBeanDefinition。
public class AccessDataProtocolMapperParser implements BeanDefinitionParser {
@Override
public BeanDefinition parse(Element element, ParserContext parserContext) {
//逻辑
//elemeent就是自定义的
// 创建一个DefaultProtocolContext类的BeanDefinition
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(DefaultProtocol.class);
// 获取协议的命名空间
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "namespace");
// 获取协议的唯一标识
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "id");
// 获取协议数据要发送的数据通道
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "channel");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "primaryKey");
// 协议版本
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "version");
// 要发送的kafka主题
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "kafkaTopic");
// 中台数据协议小类
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "dataSType");
// 是否是实时数据
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "realTime");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "descr", "description");
String protocolId = FdauStringUtils.getProtocolId(element.getAttribute("id"), element.getAttribute(
"namespace"), element.getAttribute("version"));
String descr = element.getAttribute("descr");
if (StringUtils.isNotBlank(descr)) {
ProtocolNameMappingCache.put(protocolId, descr);
} else {
ProtocolNameMappingCache.put(protocolId, protocolId);
}
// 解析协议字段映射关系
prepareProtocolMapping(element,builder);
// 注册BeanDefinition
parserContext.getRegistry().registerBeanDefinition(getBeanName(element), builder.getBeanDefinition());
// 返回封装好的BeanDefinition
return builder.getBeanDefinition();
}
}
首先是设置protocol标签自定义的属性,然后就是要解析protocol标签下的子标签,将子标签的属性标签还有引用初始化好。
private void prepareProtocolMapping(Element element,
BeanDefinitionBuilder protocolBuilder) {
ManagedList<Object> list = new ManagedList<>();
// 解析协议的所有字段
List<Element> fieldElements = DomUtils.getChildElementsByTagName(element, "field");
if (CollectionUtils.isNotEmpty(fieldElements)) {
for (Element fieldElement : fieldElements) {
BeanDefinition protocolFieldContext = prepareProtocolFieldContext(fieldElement);
list.add(protocolFieldContext);
}
protocolBuilder.addPropertyValue("protocolFieldList", list);
}
List<Element> referenceElements = DomUtils.getChildElementsByTagName(element, "reference");
if(CollectionUtils.isNotEmpty(referenceElements)){
for (Element referenceElement : referenceElements) {
BeanDefinition protocolFieldContext = prepareReferenceProtocol(referenceElement);
list.add(protocolFieldContext);
}
protocolBuilder.addPropertyValue("refProtocolList", list);
}
}
这个子标签就涉及到xml中的如何在使用标签了,AccessDataProtocolMapperParser 这个类的parse就是在解析每一个自定义xml(含有protocol标签的,因为注入解析器时,传的标签名为protocol)。
下面解析protolcol下面filed子标签的代码过程
private BeanDefinition prepareProtocolFieldContext(Element fieldElement) {
// 生成数据协议上下文BeanDefinition
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(ProtocolField.class);
// 获取数据协议字段属性BeanDefinition
BeanDefinition protocolFieldAttribute = mapFieldAttribute(fieldElement);
// 准备字段策略
List<Object> strategys = prepareStrategys(fieldElement, "strategys");
builder.addPropertyValue("strategys", strategys);
builder.addPropertyValue("protocolFieldAttribute", protocolFieldAttribute);
return builder.getBeanDefinition();
}
private BeanDefinition mapFieldAttribute(Element fieldElement) {
// 获取协议字段属性的BeanDefinition
BeanDefinitionBuilder builder =
BeanDefinitionBuilder.genericBeanDefinition(ProtocolFieldAttribute.class);
// field元素中所有的属性节点
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, fieldElement, "src","sourceField");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, fieldElement, "dest","targetField");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, fieldElement, "srcType","sourceType");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, fieldElement, "destType","targetType");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, fieldElement, "required");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, fieldElement, "len", "length");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, fieldElement, "default","defaultValue");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, fieldElement, "requiredOnCondition");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, fieldElement, "condition");
return builder.getBeanDefinition();
}
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, fieldElement, “dest”, “targetField”)
这个方法是把xml的标签值映射成ProtocolFieldAttribute中的成员属性
@Data
public class ProtocolFieldAttribute implements Serializable, Cloneable {
private static final long serialVersionUID = 8264557930205994292L;
/**
* 目标协议字段
*/
private String targetField;
/**
* 源数据字段
*/
private String sourceField;
/**
* 源数据类型
*/
private String sourceType;
/**
* 目标数据类型
*/
private String targetType;
/**
* 字段是否必填
*/
private boolean required = false;
/**
* 字段长度
*/
private Integer length;
/**
* 默认值
*/
private Object defaultValue;
/**
* 必填条件
*/
private String requiredOnCondition;
/**
* 字段转换的条件
*/
private String condition;
/**
* 字段值
*/
private Object value;
}
检验策略模式加载
private ManagedList<Object> prepareStrategys(Element fieldElement, String elementName) {
// 累积策略的集合
ManagedList<Object> list = new ManagedList<>();
// 设置默认的校验策略
prepareDefaultVerificationStrategys(list);
// 获取Strategy节点元素
Element strategys = DomUtils.getChildElementByTagName(fieldElement, elementName);
if (strategys == null) {
return list;
}
// 获取additivity属性值
String additivity = strategys.getAttribute("additivity");
// 如果additivity没有配置或者为true 则增加默认的校验策略
if (StringUtils.isNotBlank(additivity) && !Boolean.parseBoolean(additivity)) {
list.clear();
}
// 查询节点下的所有策略
List<Element> strategyList = DomUtils.getChildElementsByTagName(strategys, "strategy");
if (CollectionUtils.isEmpty(strategyList)) {
return list;
}
for (Element strategy : strategyList) {
BeanDefinition definition = prepareStrategy(strategy);
if (definition == null) {
continue;
}
list.add(definition);
}
return list;
}
到这基本上如何去加载的已经很清楚了,新增协议时就是新增xml配置,根据url映射不同的xml文件,一开始的时候是加载了命名空间和协议id的,后续integration通道集成也可以从映射协议中渠道kafkaTopic,根据前文,设置kafkaHeader,进行消息发送。
中台对消息主题的消息进行消费,入库,清洗以及数据分析。
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns="http://com.dahua/schema/accessData/protocol" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://com.dahua/schema/accessData/protocol">
<xsd:element name="protocol">
<xsd:annotation>
<xsd:documentation>
数据协议字段映射关系顶层元素
</xsd:documentation>
</xsd:annotation>
<xsd:complexType>
<xsd:choice>
<xsd:element minOccurs="0" maxOccurs="unbounded" ref="reference"/>
<xsd:element minOccurs="0" maxOccurs="unbounded" ref="field"/>
</xsd:choice>
<xsd:attribute name="namespace" type="xsd:string" >
<xsd:annotation>
<xsd:documentation>
数据协议命名空间(协议大类)
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="id" type="xsd:string" use="required">
<xsd:annotation>
<xsd:documentation>
数据协议名称(协议小类)
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="channel" type="xsd:string">
<xsd:annotation>
<xsd:documentation>
数据发送通道
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="primaryKey" type="xsd:string">
<xsd:annotation>
<xsd:documentation>
源数据平台数据唯一键
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="kafkaTopic" type="xsd:string">
<xsd:annotation>
<xsd:documentation>
中台数据协议大类
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="dataSType" type="xsd:string">
<xsd:annotation>
<xsd:documentation>
中台数据协议小类
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="realTime" type="xsd:boolean">
<xsd:annotation>
<xsd:documentation>
实时数据
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="version" type="xsd:string">
<xsd:annotation>
<xsd:documentation>
协议版本号
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="descr" type="xsd:string">
<xsd:annotation>
<xsd:documentation>
数据协议名称中文描述
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
</xsd:complexType>
</xsd:element>
<xsd:element name="field" type="fieldType">
<xsd:annotation>
<xsd:documentation>
数据协议字段
</xsd:documentation>
</xsd:annotation>
</xsd:element>
<xsd:element name="reference">
<xsd:annotation>
<xsd:documentation>
数据协议引用
</xsd:documentation>
</xsd:annotation>
<xsd:complexType>
<xsd:attributeGroup ref="refAttribute"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="strategys" type="strategysType">
<xsd:annotation>
<xsd:documentation>
字段策略集合
</xsd:documentation>
</xsd:annotation>
</xsd:element>
<xsd:element name="strategy" type="strategyType">
<xsd:annotation>
<xsd:documentation>
字段具体策略
</xsd:documentation>
</xsd:annotation>
</xsd:element>
<xsd:element name="minValue" type="xsd:integer">
<xsd:annotation>
<xsd:documentation>
最大值
</xsd:documentation>
</xsd:annotation>
</xsd:element>
<xsd:element name="maxValue" type="xsd:integer" >
<xsd:annotation>
<xsd:documentation>
最小值
</xsd:documentation>
</xsd:annotation>
</xsd:element>
<xsd:element name="pattern" type="xsd:string" >
<xsd:annotation>
<xsd:documentation>
正则表达式
</xsd:documentation>
</xsd:annotation>
</xsd:element>
<xsd:element name="enums" type="xsd:anySimpleType" >
<xsd:annotation>
<xsd:documentation>
枚举值
</xsd:documentation>
</xsd:annotation>
</xsd:element>
<xsd:element name="dicMapping">
<xsd:annotation>
<xsd:documentation>
字典映射组
</xsd:documentation>
</xsd:annotation>
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="mapping" maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:attribute name="id" type="xsd:string">
<xsd:annotation>
<xsd:documentation>
字典映射组唯一标识
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
</xsd:complexType>
</xsd:element>
<xsd:element name="mapping">
<xsd:annotation>
<xsd:documentation>
字典值映射
</xsd:documentation>
</xsd:annotation>
<xsd:complexType>
<xsd:attribute name="sourceValue" type="xsd:anySimpleType">
<xsd:annotation>
<xsd:documentation>
源字典值
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="targetValue" type="xsd:anySimpleType">
<xsd:annotation>
<xsd:documentation>
目标字典值
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="fieldType">
<xsd:annotation>
<xsd:documentation>
数据协议映射结果集
</xsd:documentation>
</xsd:annotation>
<xsd:sequence>
<xsd:element ref="strategys" minOccurs="0"/>
</xsd:sequence>
<xsd:attributeGroup ref="fieldAttribute"/>
</xsd:complexType>
<xsd:attributeGroup name="fieldAttribute">
<xsd:annotation>
<xsd:documentation>
字段元素的所有属性
sourceField 源数据字段
targetField 目标数据字段
sourceType 源数据类型
targetType 目标数据类型
required 是否必填
length 字段长度
defaultValue 字段默认值
</xsd:documentation>
</xsd:annotation>
<xsd:attribute name="src" type="xsd:string"/>
<xsd:attribute name="dest" type="xsd:string"/>
<xsd:attribute name="srcType" type="xsd:string"/>
<xsd:attribute name="destType" type="xsd:string"/>
<xsd:attribute name="required" type="xsd:boolean"/>
<xsd:attribute name="len" type="xsd:integer"/>
<xsd:attribute name="default" type="xsd:anySimpleType"/>
<xsd:attribute name="condition" type="xsd:string"/>
<xsd:attribute name="requiredOnCondition" type="xsd:string"/>
</xsd:attributeGroup>
<xsd:complexType name="strategysType">
<xsd:annotation>
<xsd:documentation>
字段内容提取/校验的策略配置
</xsd:documentation>
</xsd:annotation>
<xsd:sequence>
<xsd:element ref="strategy" minOccurs="1" maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:attribute name="additivity" type="xsd:boolean">
<xsd:annotation>
<xsd:documentation>
标识策略是否叠加
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
</xsd:complexType>
<xsd:complexType name="strategyType">
<xsd:annotation>
<xsd:documentation>
策略子元素
</xsd:documentation>
</xsd:annotation>
<xsd:sequence>
<xsd:element ref="minValue" minOccurs="0">
<xsd:annotation>
<xsd:documentation>
最大值
</xsd:documentation>
</xsd:annotation>
</xsd:element>
<xsd:element ref="maxValue" minOccurs="0">
<xsd:annotation>
<xsd:documentation>
最小值
</xsd:documentation>
</xsd:annotation>
</xsd:element>
<xsd:element ref="pattern" minOccurs="0">
<xsd:annotation>
<xsd:documentation>
正则表达式
</xsd:documentation>
</xsd:annotation>
</xsd:element>
<xsd:element ref="enums" minOccurs="0" maxOccurs="unbounded">
<xsd:annotation>
<xsd:documentation>
枚举值
</xsd:documentation>
</xsd:annotation>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="class" type="xsd:string">
<xsd:annotation>
<xsd:documentation>
策略类的全限定路径
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="dicTypeCode" type="xsd:string">
<xsd:annotation>
<xsd:documentation>
字典类型编码
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="dicMapping" type="xsd:string">
<xsd:annotation>
<xsd:documentation>
字典值映射
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="relyField" type="xsd:string">
<xsd:annotation>
<xsd:documentation>
关系主键映射
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="relyValue" type="xsd:string">
<xsd:annotation>
<xsd:documentation>
关系主键值映射
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
<xsd:attribute name="preExtract" type="xsd:boolean">
<xsd:annotation>
<xsd:documentation>
是否将执行策略前置到校验策略前执行
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
</xsd:complexType>
<xsd:attributeGroup name="refAttribute">
<xsd:annotation>
<xsd:documentation>
id 协议id
namespace 协议命名空间
condition 引用条件
</xsd:documentation>
</xsd:annotation>
<xsd:attribute name="id" type="xsd:string"/>
<xsd:attribute name="namespace" type="xsd:string"/>
<xsd:attribute name="condition" type="xsd:string"/>
</xsd:attributeGroup>
</xsd:schema>
协议例子
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:fdau="http://com.dahua/schema/accessData/protocol"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://com.dahua/schema/accessData/protocol http://com.dahua/schema/accessData/protocol/fdau-protocol.xsd">
<fdau:protocol id="deviceState" descr="设备/部件运行状态" namespace="SZD">
<fdau:reference id="mainframeState" namespace="SZD"
condition="T(java.lang.String).valueOf(['device_category']) == '1'"/>
<fdau:reference id="detectorState" namespace="SZD"
condition="T(java.lang.String).valueOf(['device_category']) == '2'"/>
</fdau:protocol>
<fdau:protocol id="mainframeState" descr="设备运行状态" namespace="SZD" primaryKey="event_id"
kafkaTopic="collIotDevice" dataSType="mainframeRunStatus">
<!--1.3.1-->
<fdau:field src="mainframeCode" destType="String" dest="mainframeCode" len="128"/>
<fdau:field src="mainframeRunBigStatus" destType="String" dest="mainframeRunBigStatus" len="32">
<fdau:strategys additivity="true">
<fdau:strategy class="com.dahua.paas.fdau.common.strategy.DictionaryCheckStrategy" dicTypeCode="6088"/>
</fdau:strategys>
</fdau:field>
<fdau:field src="mainframeRunSmallStatus" destType="String" dest="mainframeRunSmallStatus" len="32">
<fdau:strategys additivity="true">
<fdau:strategy class="com.dahua.paas.fdau.common.strategy.DictionaryCheckStrategy" dicTypeCode="6127"/>
</fdau:strategys>
</fdau:field>
<fdau:field src="controlRoomId" destType="String" dest="controlRoomId" len="64"/>
<fdau:field src="controlRoomCode" destType="String" dest="controlRoomCode" len="128"/>
<!--1.3.1-->
<fdau:field src="event_id" dest="recordId" destType="String" len="32" required="true"/>
<fdau:field src="device_category" dest="device_category" destType="Integer" len="3" required="true">
<fdau:strategys additivity="true">
<fdau:strategy class="com.dahua.paas.fdau.common.strategy.EnumValueCheckStrategy">
<fdau:enums>1</fdau:enums>
<fdau:enums>2</fdau:enums>
<fdau:enums>999</fdau:enums>
</fdau:strategy>
</fdau:strategys>
</fdau:field>
<fdau:field src="device_id" dest="mainframeId" destType="String" len="32" required="true"/>
<fdau:field src="online_status" dest="onlineStatus" destType="String" len="3" required="true">
<fdau:strategys additivity="true">
<fdau:strategy class="com.dahua.paas.fdau.common.strategy.EnumValueCheckStrategy">
<fdau:enums>0</fdau:enums>
<fdau:enums>1</fdau:enums>
</fdau:strategy>
</fdau:strategys>
</fdau:field>
<fdau:field src="work_status" dest="runningStatus" destType="String" len="3" required="true">
<fdau:strategys additivity="true">
<fdau:strategy class="com.dahua.paas.fdau.common.strategy.EnumValueCheckStrategy">
<fdau:enums>0</fdau:enums>
<fdau:enums>1</fdau:enums>
</fdau:strategy>
</fdau:strategys>
</fdau:field>
<fdau:field src="event_time" dest="happenTime" destType="String" len="20" required="true">
<fdau:strategys additivity="true">
<fdau:strategy class="com.dahua.paas.fdau.common.strategy.DateFormatCheckStrategy"/>
</fdau:strategys>
</fdau:field>
<fdau:field src="parent_id" destType="String" dest="operationServiceOrgId" len="32" required="true"/>
<fdau:field src="platformCode" dest="platformCode" destType="String" len="8" required="true"/>
<fdau:field src="recordUpdateTime" destType="String" dest="recordUpdateTime" len="64"
default="T(com.dahua.paas.fdau.common.util.DateUtils).formateDate(new java.util.Date())"/>
</fdau:protocol>
<fdau:protocol id="detectorState" descr="部件运行状态" namespace="SZD" primaryKey="event_id"
kafkaTopic="collIotDevice" dataSType="detectorRunStatus">
<!--1.3.1-->
<fdau:field src="detectorCode" destType="String" dest="detectorCode" len="128"/>
<fdau:field src="detectorRunBigStatus" destType="String" dest="detectorRunBigStatus" len="8">
<fdau:strategys additivity="true">
<fdau:strategy class="com.dahua.paas.fdau.common.strategy.DictionaryCheckStrategy" dicTypeCode="6091"/>
<fdau:strategy class="com.dahua.paas.fdau.common.strategy.DictionaryExtractStrategy" dicMapping="detectorRunBigStatusRefMapping"/>
</fdau:strategys>
</fdau:field>
<fdau:field src="detectorRunSmallStatus" destType="String" dest="detectorRunSmallStatus" len="8">
<fdau:strategys additivity="true">
<fdau:strategy class="com.dahua.paas.fdau.common.strategy.DictionaryCheckStrategy" dicTypeCode="6126"/>
</fdau:strategys>
</fdau:field>
<fdau:field src="controlRoomId" destType="String" dest="controlRoomId" len="64"/>
<fdau:field src="controlRoomCode" destType="String" dest="controlRoomCode" len="128"/>
<fdau:field src="remark" destType="String" dest="memo" len="256"/>
<fdau:field src="chargerNum" destType="Integer" dest="chargerNum" default="-1"/>
<!--1.3.1-->
<fdau:field src="event_id" dest="recordId" destType="String" len="32" required="true"/>
<fdau:field src="device_category" dest="device_category" destType="Integer" len="3" required="true">
<fdau:strategys additivity="true">
<fdau:strategy class="com.dahua.paas.fdau.common.strategy.EnumValueCheckStrategy">
<fdau:enums>1</fdau:enums>
<fdau:enums>2</fdau:enums>
</fdau:strategy>
</fdau:strategys>
</fdau:field>
<fdau:field src="device_id" dest="detectorId" destType="String" len="32" required="true"/>
<fdau:field src="online_status" dest="onlineStatus" destType="String" len="3" required="true">
<fdau:strategys additivity="true">
<fdau:strategy class="com.dahua.paas.fdau.common.strategy.EnumValueCheckStrategy">
<fdau:enums>0</fdau:enums>
<fdau:enums>1</fdau:enums>
</fdau:strategy>
</fdau:strategys>
</fdau:field>
<fdau:field src="work_status" dest="runningStatus" destType="String" len="3" required="true">
<fdau:strategys additivity="true">
<fdau:strategy class="com.dahua.paas.fdau.common.strategy.EnumValueCheckStrategy">
<fdau:enums>0</fdau:enums>
<fdau:enums>1</fdau:enums>
</fdau:strategy>
</fdau:strategys>
</fdau:field>
<fdau:field src="event_time" dest="happenTime" destType="String" len="20" required="true">
<fdau:strategys additivity="true">
<fdau:strategy class="com.dahua.paas.fdau.common.strategy.DateFormatCheckStrategy"/>
</fdau:strategys>
</fdau:field>
<fdau:field src="parent_id" destType="String" dest="operationServiceOrgId" len="32" required="true"/>
<fdau:field src="platformCode" dest="platformCode" destType="String" len="8" required="true"/>
</fdau:protocol>
</beans>