如何对同一个指令,同一个协议版本,用多个@Jt808RequestHandlerMapping注解的方法处理
比如0x0200指令,针对苏标和粤标采用不同的方法去处理,可以做到解析2013苏标、2019苏标、2013粤标和2019粤标
@Jt808RequestHandlerMapping(msgType = 0x0200, versions = AUTO_DETECTION, desc = "位置信息上报(苏标)") public BuiltinMsg8001 t0200SU(Jt808RequestEntity req) {
}
@Jt808RequestHandlerMapping(msgType = 0x0200, versions = AUTO_DETECTION, desc = "位置信息上报(粤标)") public BuiltinMsg8001 t0200YUE(Jt808RequestEntity<T0200YUE> req) {
}
这个应该做不到。 无论是苏标还是粤标,请求头中的信息都是一样的,无法通过请求头区分出到底是苏标还是粤标。
据我所知,好像只能在解析消息体之后,通过消息附加项判断。比如苏标消息附加项中可能会出现(也可能不出现) 附加项 ID 为 0x64、0x65、0x66 、... 的扩展附加项。
可以参考示例项目中的写法: LocationMsgService.java#L57
或许可以用自定义的生命周期监听器来实现? @Override public boolean beforeDispatch(Jt808Request request) { return Jt808RequestLifecycleListener.super.beforeDispatch(request); } 例如根据消息头中的消息ID和终端手机号来判断接下来分发到哪个被@Jt808RequestHandlerMapping注解的方法处理。我对消息分发器不是很了解,请教一下作者这么做是否可以?
目前 @Jt808RequestHandlerMapping 就是通过消息头中的 消息ID 来分发的。
但是,仅仅通过消息头的 消息ID 和手机号是没法区分到底是苏标还是其他扩展的。比如对于你提到的 0x0200 位置上报消息来说,消息头中的 消息ID 都是 0x0200 (不论是苏标还是其他扩展)。一般而言,手机号并不能用来判断是苏标还是其他扩展。
如果你想干预消息处理器的分发逻辑 或 你想自定义消息处理器(比如实现自己的消息处理器注解) 的话,可以参考下面几个组件:
Jt808DispatcherHandlerJt808HandlerMappingJt808HandlerAdapterJt808HandlerResultHandler这几个组件都是从spring中借鉴(抄袭😂)过来的,扩展思路和spring一致。
前提是: 在仅仅知道 消息ID 和 手机号 的情况下 ,怎么知道到底是哪种扩展?我认为这是不太可行的。如果你的业务场景中能通过手机号判断出到底是苏标还是其他扩展的话,可以参考一下 Jt808DispatcherHandler 的消息处理逻辑,然后自定义消息处理器隐射逻辑。