flowable 监听器无法获取spring bean ,自动注入bean为null,解决方案

简介: flowable 监听器无法获取spring bean ,自动注入bean为null,解决方案
package com.sinochem.it.bpm.flowable.handler;
import com.sinochem.it.bpm.flowable.config.TaskCallbackUrlConfig;
import com.sinochem.it.bpm.flowable.exception.FlowException;
import lombok.extern.slf4j.Slf4j;
import org.flowable.engine.delegate.TaskListener;
import org.flowable.task.service.delegate.DelegateTask;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.Map;
/**
 * 多实例任务监听器
 * @author : jiagang
 * @date : Created in 2021/9/14 9:06
 */
@Component
@Slf4j
public class MultiInstanceUserTaskListener implements TaskListener {
    @Autowired
    private TaskCallbackUrlConfig taskCallbackUrlConfig;
    @Autowired
    private RestTemplate restTemplate;
    private static MultiInstanceUserTaskListener myListener;
    /**
     * 监听器中无法获取spring bean配置
     */
    @PostConstruct
    public void init() {
        myListener = this;
        myListener.taskCallbackUrlConfig = this.taskCallbackUrlConfig;
        myListener.restTemplate = this.restTemplate;
    }
    @Override
    public void notify(DelegateTask delegateTask) {
        try {
            String[] strings = delegateTask.getAssignee().split("_");
            Map<String, Object> paramsMap = new HashMap<>();
            paramsMap.put("taskAssignee",delegateTask.getAssignee()); // 审批人code
            paramsMap.put("taskAssigneeName",delegateTask.getAssignee()); // 审批人name
            if (strings.length >= 2){
                paramsMap.put("taskAssignee",strings[0]); // 审批人code
                paramsMap.put("taskAssigneeName",strings[1]); // 审批人name
            }
            paramsMap.put("tenantId",delegateTask.getTenantId());
            paramsMap.put("businessInstanceId",delegateTask.getVariable("businessInstanceId"));
            paramsMap.put("initiatorUserCode", delegateTask.getVariable("userCode")); //发起人用户标识
            paramsMap.put("initiatorUserName", delegateTask.getVariable("userName")); //发起人用户名
            paramsMap.put("taskId", delegateTask.getId());
            paramsMap.put("taskName", delegateTask.getName());
            paramsMap.put("description", delegateTask.getDescription());
            paramsMap.put("wfName", delegateTask.getVariable("wfName"));
            paramsMap.put("billId", delegateTask.getVariable("billId")); //单据id
            paramsMap.put("approveTitle", delegateTask.getVariable("approveTitle")); //送审标题
            paramsMap.put("billType", delegateTask.getVariable("billType"));
            paramsMap.put("approveURL",delegateTask.getVariable("approveURL"));
            paramsMap.put("variables",delegateTask.getVariables());
            HttpHeaders headers = new HttpHeaders();
            headers.add("Content-Type","application/json");
            HttpEntity<Object> entity = new HttpEntity<Object>(paramsMap,headers);
            Map s = myListener.restTemplate.postForObject(myListener.taskCallbackUrlConfig.getAddMultiInstanceUserTaskCallbackUrl(), entity,Map.class);
            if (!s.get("code").equals(0)) {
                throw new FlowException("流程任务事件(多实例会签任务回调)回调API接口异常,异常信息:" + s.get("msg"));
            }
            log.info("流程实例id:" + delegateTask.getProcessInstanceId() + ",任务id:" + delegateTask.getId() + ",审批人:" + delegateTask.getAssignee());
        }catch (Exception e){
            String strMsg = "流程任务事件(多实例会签任务回调)回调API接口"
                    + ",流程实例ID=" + delegateTask.getProcessInstanceId()
                    + ",任务TaskID=" + delegateTask.getId()
                    + ",异常信息:" + e.getMessage();
            log.error(strMsg);
            throw new FlowException(strMsg);
        }
    }
}

注意调用时需要如下方式调用:

文章持续更新,可以关注下方公众号或者微信搜一搜「 最后一支迷迭香 」第一时间阅读,获取更完整的链路资料。

相关文章
|
XML Java 测试技术
Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)
Spring 第三节 IOC——基于注解配置和管理Bean 万字详解!
882 26
|
11月前
|
JSON Java fastjson
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——使用 fastJson 处理 null
本文介绍如何使用 fastJson 处理 null 值。与 Jackson 不同,fastJson 需要通过继承 `WebMvcConfigurationSupport` 类并覆盖 `configureMessageConverters` 方法来配置 null 值的处理方式。例如,可将 String 类型的 null 转为 &quot;&quot;,Number 类型的 null 转为 0,避免循环引用等。代码示例展示了具体实现步骤,包括引入相关依赖、设置序列化特性及解决中文乱码问题。
601 0
|
存储 Java Spring
【Spring】获取Bean对象需要哪些注解
@Conntroller,@Service,@Repository,@Component,@Configuration,关于Bean对象的五个常用注解
402 12
|
存储 Java 应用服务中间件
【Spring】IoC和DI,控制反转,Bean对象的获取方式
IoC,DI,控制反转容器,Bean的基本常识,类注解@Controller,获取Bean对象的常用三种方式
538 12
|
XML Java 数据格式
Spring容器Bean之XML配置方式
通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
453 6
|
XML Java 数据格式
🌱 深入Spring的心脏:Bean配置的艺术与实践 🌟
本文深入探讨了Spring框架中Bean配置的奥秘,从基本概念到XML配置文件的使用,再到静态工厂方式实例化Bean的详细步骤,通过实际代码示例帮助读者更好地理解和应用Spring的Bean配置。希望对你的Spring开发之旅有所助益。
523 4
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之从MySQL同步数据到Doris时,历史数据时间字段显示为null,而增量数据部分的时间类型字段正常显示的原因是什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
SQL 关系型数据库 MySQL
python在mysql中插入或者更新null空值
这段代码是Python操作MySQL数据库的示例。它执行SQL查询从表`a_kuakao_school`中选取`id`,`university_id`和`grade`,当`university_id`大于0时按升序排列。然后遍历结果,根据`row[4]`的值决定`grade`是否为`NULL`。若不为空,`grade`被格式化为字符串;否则,设为`NULL`。接着构造UPDATE语句更新`university`表中对应`id`的`grade`值,并提交事务。重要的是,字符串`NULL`不应加引号,否则更新会失败。
423 2
|
SQL 关系型数据库 MySQL
在 MySQL 中使用 IS NULL
【8月更文挑战第12天】
1110 0
在 MySQL 中使用 IS NULL
|
SQL 关系型数据库 MySQL
mysql不等于<>取特定值反向条件的时候字段有null值或空值读取不到数据
对于数据库开发的专业人士来说,理解NULL的特性并知道如何正确地在查询中处理它们是非常重要的。以上所介绍的技巧和实例可以帮助你更精准地执行数据库查询,并确保数据的完整性和准确性。在编写代码和设计数据库结构时,牢记这些细节将有助于你避免许多常见的错误,提高数据库应用的质量与性能。
559 0

热门文章

最新文章