比如对接一些第三方,会有异步通知,或者在第三方设置唯一回调接口,或者统一验签等场景,这个时候可能就需要我们搞一个统一入口来处理不同的业务。
1:定义统一入口
@RestController
@RequestMapping(value = "/notify")
public class NotifyController {
private IHandler handler;
@PostMapping(value = "/callback")
public String callback(@RequestBody String body) {
//处理通知
Integer status = handler.handle(body);
return "success";
}
}
2:定义处理业务handler
public interface INotifyHandler {
/**
* 业务类型
*/
public String handleType();
/**
* 业务处理
*/
Integer handle(String notifyBody);
}
3:具体业务处理
public class NotifySignHandler implements INotifyHandler {
@Override
public String handleType() {
return "sign";
}
@Override
public Integer handle(String notifyBody) {
//业务处理
......
}
}
4:重要的一步,编写handler,handler 主要做两件事
1:收集所有INotifyHandler的实现类放入map中;
2:校验业务类型,执行处理业务逻辑
public interface handler{
private ApplicationContext applicationContext;
private Map<String,INotifyHandler> notifyHandlerMap;
/**
* 启动加载
*/
@PostConstruct
public void init(){
Map<String,INotifyHandler> map = applicationContext.getBeansOfType(INotifyHandler.class);
Collection<INotifyHandler> handlers = map.values();
if(CollectionUtils.isEmpty(handlers)){
return;
}
notifyHandlerMap= handlers.stream().collect(Collectors.toMap(INotifyService::handleType, x -> x));
}
@Override
public Map<String, INotifyHandler> getNotifyHandlerMap() {
return notifyHandlerMap;
}
@Override
public Integer handle(String body) {
//参数处理+验签逻辑
......
//获取具体的业务实现类
INotifyHandler notifyHandler=notifyHandlerMap.get(notifyType);
Integer status=null;
if(Objects.nonNull(notifyHandler)) {
//执行具体业务
try {
status=notifyHandler.handle(JSON.toJSONString(requestParameter));
} catch (Exception e) {
e.printStackTrace();
}
}
//后续逻辑处理
......
return status;
}
}