跳至主要內容

请求消息映射

hylexus约 1024 字大约 3 分钟

请求消息映射

@Jt808RequestHandler

@Jt808RequestHandler 注解的作用类似于 WebFlux/WebMvc 中的 @Controller/@RestController

就是标记一下被该注解修饰的类中存在若干个能处理请求的处理器方法。没有其他任何属性。

警告

被该注解标记的类应该是被 Spring 管理的类。一般来说应该和 Spring@Component 等注解同时出现。

因为在 2.x 中去掉了配置包手动扫描的功能(配置繁琐,还不如直接交给 Spring 来处理)。

@Jt808RequestHandlerMapping

该注解和 WebFlux/WebMvc@RequestMapping@GetMapping 等注解功能类似。

表明被该注解修饰的方法具有处理请求的能力。

属性

属性说明默认值示例
msgType消息类型--{0x0001}{0x0102}
versions协议版本AUTO_DETECTIONVERSION_2013{VERSION_2019,VERSION_2013}
desc描述信息"""Some description ..."

示例

@Component
@Jt808RequestHandler
public class CommonHandler {
    @Jt808RequestHandlerMapping(msgType = 0x0100, versions = VERSION_2019, desc = "xxx")
    public TerminalRegisterReplyMsg clientRegisterV2019(Jt808RequestEntity<BuiltinMsg0100V2019> request) {
        final BuiltinMsg0100V2019 body = request.body();
        log.info("client register v2019 : {}", body);
        return new TerminalRegisterReplyMsg().setFlowId(request.flowId()).setResult((byte) 0).setAuthCode("AuthCode2019----");
    }
}



 






@Jt808RequestBody

该注解和 WebFlux/WebMvc@RequestBody 注解功能类似。 可以将 请求体 映射到被该注解修饰的类。

@Jt808RequestHandler 注解一样,该注解仅仅起一个标记作用,暂时没有其他属性。

@RequestField

属性

属性说明默认值示例
order字段解析顺序(不要求连续,只比较大小)--012
startIndex起始字节索引(2.1.1开始不再需要指定)-10248
startIndexExpression作用和 startIndex 相同,但是该属性是基于 SpEL 的(2.1.1开始不再需要指定)"""#ctx.msgBodyLength() - 27 + 1"
startIndexMethod作用和 startIndex 相同,但是该属性返回的是一个方法名(2.1.1开始不再需要指定)""somMethodName
length该字段所占的字节数、长度-124
lengthExpression作用和 length 相同,但是该属性是基于 SpEL""#this.someFieldValue + 1 - 2 * 3
lengthMethod作用和 length 相同, 但是该属性返回的是一个 方法名"""SomMethodName"
dataType数据类型--DWORDBYTES
customerFieldDeserializerClass自定义的类型转换器--XxxDeserializer.class

SpEL

该注解的 startIndexExpressionlengthExpression 两个属性支持 SpEL。可用的 SpEL元数据如下:

属性说明
this正在迭代的当前对象
request本次请求对应的 Jt808Request 实例
header本次请求对应的 Jt808Request#header() 实例
ctxAnnotationDecoderContext 实例,代表正在迭代对象的上下文(msgBodyLength 属性代表当前正在迭代的数据大小(字节数))
contextctx

提示

SpEL 绑定的 RootObject 就是当前正在迭代的对象。

所以 #this.someField 等价于 someField#this.someMethod() 等价于 someMethod() (#this 可以省略)。

示例

提示

2.1.1 开始 startIndex, startIndexExpression, startIndexMethod 可以省略。

@Jt808RequestBody
public class BuiltinMsg0100V2019 {
    // 1. [0-2) WORD 省域ID
    // WORD 类型固定长度就是2字节 所以无需指定length
    @RequestField(order = 1, dataType = WORD)
    private int provinceId;

    // 2. [2-4) WORD 省域ID
    @RequestField(order = 2, dataType = WORD)
    private int cityId;

    // 3. [4-15) BYTE[11] 制造商ID
    @RequestField(order = 3, dataType = STRING, length = 11)
    private String manufacturerId;

    // 4. [15-45) BYTE[30] 终端型号
    @RequestField(order = 4, dataType = STRING, length = 30)
    private String terminalType;

    // 5. [45-75) BYTE[30] 终端ID
    @RequestField(order = 5, dataType = STRING, length = 30)
    private String terminalId;

    // 6. [75]   BYTE    车牌颜色
    @RequestField(order = 6, dataType = BYTE)
    private byte color;

    // 7. [76,n)   String    车辆标识
    // 使用 SpEL 计算消息长度(上下文中的消息体总长度减去前面消费掉的字节数)
    @RequestField(order = 7, dataType = STRING, lengthExpression = "#ctx.msgBodyLength() - 76")
    private String carIdentifier;
}




 



 



 



 



 



 




 


@SlicedFrom

警告

该注解目前仅仅适用于 intshortbyte 类型的字段。

2.1.1 开始支持 long 类型。

属性

sourceFieldName源字段名
bitIndex源字段中的第几个bit0
startBitIndex源字段中的起始bit索引1
endBitIndex源字段中的终止bit索引2

示例

提示

2.1.1 开始 startIndex, startIndexExpression, startIndexMethod 可以省略。

@Jt808RequestBody
public class BuiltinMsg0200V2013 {

    // (2). byte[4,8) DWORD 状态
    @RequestField(order = 2, dataType = DWORD)
    private int status;

    // 将上面的 status 字段的第0位取出转为 int 类型
    @SlicedFrom(sourceFieldName = "status", bitIndex = 0)
    private int accIntStatus;
    
    // 将上面的 status 字段的第0位取出转为 boolean 类型
    @SlicedFrom(sourceFieldName = "status", bitIndex = 0)
    private Boolean accBooleanStatus;
    
    // 0 北纬;1 南纬
    // 将上面的 status 字段的第2位取出转为 int 类型
    @SlicedFrom(sourceFieldName = "status", bitIndex = 2)
    private int latType;
}