1.控制器
创建Controller,注入ApproveChain,在approve方法中调用approveChain
@RestController
@RequestMapping("/approve")
@Api(tags = "审批流")
public class ApproveController {
private ApproveChain approveChain;
public ApproveController(ApproveChain approveChain) {
this.approveChain = approveChain;
}
@GetMapping
@ApiOperation("审批")
public ResponseMessage approve(@RequestBody RequestVO requestVO) {
RequestDTO requestDTO = new RequestDTO();
BeanUtils.copyProperties(requestVO,requestDTO);
String result = approveChain.process(requestDTO);
return ResponseMessage.success(result);
}
}
其中VO实体类
@Data
@ApiModel(description = "用户请求")
public class RequestVO {
@ApiModelProperty("用户名称")
private String name;
@ApiModelProperty("请假天数")
private Integer day;
}
2.业务逻辑
创建Service接口
public interface ApproveService {
String process(RequestDTO request);
void setNext(ApproveService approveService) throws Exception;
ApproveService getNext();
}
分别创建四个Service实现类,其中主要注意@Order注解
@Order(1)
@Service
@Slf4j
public class ApproveServiceLeaderImpl implements ApproveService {
private ApproveService next;
@Override
public String process(RequestDTO request) {
if(request.getDay() <= 3){
log.info("Leader审批了 {} 的 {} 天请求",request.getName(),request.getDay());
return "Leader";
}
log.info("{} 的请假超出了Leader的上限,无法审批",request.getName());
return getNext().process(request);
}
@Override
public void setNext(ApproveService approveService) {
this.next = approveService;
}
@Override
public ApproveService getNext() {
return next;
}
}
然后穿件ApproveChain,将所有的ApproveService注入进来,然后在init方法中构造链条
@Service
@Slf4j
public class ApproveChain {
private ApproveService approveService;
private List<ApproveService> approveServicesList;
public ApproveChain(List<ApproveService> approveServicesList) {
this.approveServicesList = approveServicesList;
}
public String process(RequestDTO request) {
return approveService.process(request);
}
@PostConstruct
public void init() {
if (approveServicesList.size() == 0) {
log.error("没有设置责任链");
return;
}
approveService = approveServicesList.get(0);
int index = 1;
for (ApproveService handler : approveServicesList) {
if (index <= approveServicesList.size()) {
try {
handler.setNext(approveServicesList.get(index++));
log.debug("Set handler :{}", handler);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
其中使用的DTO类
@Data
public class RequestDTO {
private String name;
private Integer day;
}
3.测试
启动Application,进行登录获取Cookie:01BB1314E27551B06E5C78A4BBF0DEB0
然后调用approve接口,传入Cookie:XXL_JOB_LOGIN_IDENTITY=7b226964223a312c22757365726e616d65223a2261646d696e222c2270617373776f7264223a223034366363393730636135653037383936376138343937326534616135313735222c22726f6c65223a312c227065726d697373696f6e223a6e756c6c7d; JSESSIONID=80ADD86F29C09A3DE7F97F12B129CE1D