1. mybatis-plus逻辑删除
在配置文件配置即可,3版本后不需要再加@TableLogic
GlobalConfig globalConfig = new GlobalConfig();
// 逻辑删除字段
dbConfig.setLogicDeleteField("sfsc");
// 删除状态
dbConfig.setLogicDeleteValue("Y");
// 未删除状态
dbConfig.setLogicNotDeleteValue("N");
2. Spring的@Order
@Order 是 Spring 框架中用于定义组件排序顺序的注解。它的作用是控制 Spring 容器中多个组件(如 @Component、@Service、@Repository 等)的加载顺序或执行顺序。通常情况下,Spring 会按照默认的加载顺序将组件加载到容器中,但有时我们希望显式地指定它们的加载顺序。
3. ENUM.ordinal 是什么意思
public enum Gender { MALE, FEMALE }
埋坑小技巧,这个值是按照定义顺序来的,如上MALE是0,FEMALE是1
4. 达梦数据库导入dmp文件报错
本地编码:PG_GBK, 导入文件编码:PG_UTF8错误。
解决方式:在数据库bin目录下执行以下命令导入即可,注意把参数替换了。
dimp USERID=SYSDBA/SYSDBA@127.0.0.1:5236 FILE=C:\Users\Administrator\Desktop\sql\20230902.dmp FULL=Y
5. aop的@AfterThrowing和RestControllerAdvice哪个优先级高
@AfterThrowing(value = "@annotation(operationLog)", throwing = "e")
事实证明先走aop的@AfterThrowing,然后走@RestControllerAdvice下的@ExceptionHanlder
6. 阿里fastjson2,怎么排除不需要的字段
static String toJSONString(Object object, Filter filter, JSONWriter.Feature... features)
toJSONString 方法的第二个参数 Filter 用于指定 JSON 序列化过程中的字段过滤策略。通过使用这个参数,您可以选择性地包含或排除要序列化的对象字段。
7. @TableField(exist = false)
是 MyBatis-Plus 框架中用于标注实体类字段的注解。它的作用是告诉 MyBatis-Plus 框架在进行数据库操作时,该字段在数据库表中不存在,因此不需要进行映射和操作。
8. @RequestPart
@RequestPart 是Spring Framework中的一个注解,通常用于处理multipart/form-data类型的HTTP请求,主要用于接收上传的文件或表单数据中的某个部分(Part)。
@PostMapping("/upload")
public String handleFileUpload(@RequestPart("file") MultipartFile file,
@RequestPart("description") String description) {}
9. @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
用于控制JSON序列化和反序列化过程中日期字段的格式
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
public class MyObject {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date dateField;
// 省略 getter 和 setter 方法
}
10. org.mapstruct.Mapper
11. activiti工作流
首先要明确activiti是业务流程管理工具,首先要搞清楚的是业务流程,根据业务流程抽象出流程模型。得到流程模型就可以部署到activiti,然后就可以创建流程实例,流程实例又分为数个任务。任务可以分配给候选用户或者候选组。
然后流程引擎来执行流程,在流程执行期间可以使用任务监听器和执行监听器来触发我们自定义的逻辑,比如任务分配、权限检查。activiti还可以和spring security集成,以控制任务的访问和执行。
流程引擎执行期间,也可以在流程之间传递一些信息或控制流程行为,这叫做流程变量。还有就是任务表单,可以在执行任务过程中和用户进行交互,例如填写申请或审批信息。
最后,activiti还有历史数据功能,存储流程执行的历史数据。
还有几项高级功能:子流程、并行网关、定时任务等。
12. activiti监听器
经测试,项目启动并不会加载监听器,需要等到使用的时候才会加载。而且是进一次加载一次,并没有通用!!!!!!!
以下是一些常用的监听器以及它们的使用场景:
- JavaDelegate:
- 使用场景: 用于执行自定义的Java代码,通常在服务任务(Service Task)中执行业务逻辑或与外部系统集成。
- ExecutionListener:
- 使用场景:用于监听流程实例的生命周期事件,例如流程启动、结束、任务创建、任务完成等。可用于记录审批历史、执行流程控制、集成外部系统等。
- TaskListener:
- 使用场景:用于监听任务的生命周期事件,例如任务创建、分配给用户、完成等。通常用于发送通知、记录审批意见、任务分配等。
- Event Listener:
- 使用场景:用于监听各种流程引擎事件,例如引擎启动、流程部署、变量更新等。适用于全局事件处理和审计日志记录。
- Signal Event Listener:
- 使用场景:用于监听与信号事件相关的事件,例如信号事件的触发。信号事件可用于流程实例之间的通信。
- Message Event Listener:
- 使用场景:用于监听与消息事件相关的事件,例如消息事件的触发。消息事件可用于不同流程实例之间的消息传递。
- Error Event Listener:
- 使用场景:用于监听流程中的错误事件,通常表示流程执行过程中的异常情况。可用于错误处理和通知。
- Timer Event Listener:
- 使用场景:用于监听与定时器事件相关的事件,例如定时器的触发、取消等。适用于定时任务的处理。
- MultiInstance Activity Listener:
- 使用场景:用于监听多实例子流程的事件,例如迭代开始、迭代结束、迭代完成等事件。适用于多实例任务的处理。
- User Task Assignment Listener:
- 使用场景:用于监听用户任务的分配和委派事件。可用于在用户任务分配或委派给其他用户时执行自定义操作。
- Form Property Listener:
- 使用场景:用于监听表单属性的事件,例如表单字段的值变更。适用于在用户任务表单中捕获用户输入和执行验证。
13. 监听器在activiti中扮演的角色
在Activiti中,监听器(Listeners)扮演着重要的角色,用于监视和响应流程引擎中发生的各种事件。这些事件可以涵盖整个流程的生命周期,从流程实例的启动到结束,以及任务的创建、分配和完成等各个阶段。以下是监听器在Activiti中的主要角色和作用:
- 自定义业务逻辑:
监听器允许您在流程执行的不同阶段嵌入自定义的业务逻辑。这意味着您可以根据特定的业务需求在不同的事件触发时执行不同的操作,例如审批、数据处理、通知等。
- 流程控制:
使用监听器,您可以在流程执行期间做出决策。例如,可以在任务创建时检查条件,根据条件将任务分配给不同的用户或用户组,从而实现流程控制和分支。
- 通知和协作:
监听器可以用于发送通知、电子邮件或集成其他通信工具,以便流程中的不同参与者之间进行协作。这可以提高流程的协同性和通信效率。
- 审计和监控:
通过监听器,您可以记录审批历史、审计日志以及流程指标。这有助于跟踪流程的执行情况,监控性能并生成相关报告。
- 异常处理:
监听器可以捕获和处理流程中的异常事件,例如错误事件。这允许您实施错误处理和恢复策略,以确保流程的稳健性。
- 动态性和可配置性:
使用监听器,您可以将业务逻辑与流程定义分离,使流程变得动态和可配置。您可以随时修改监听器的行为,而不必修改流程定义,从而提高了流程的灵活性。
总之,监听器在Activiti中扮演着关键的角色,为业务流程的成功实施和适应性提供了强大的工具。通过使用适当的监听器,您可以根据特定的业务需求调整和优化流程,确保流程在不同情况下的正确执行和协同。这使得Activiti成为了在企业中构建和管理复杂业务流程的有力工具。
14. activiti怎么和spring security做整合,实现让指定角色或单位处理任务,甚至单位和角色都满足才可以执行任务
一种最简单的方式是,用户、单位、角色等等都设置进assignee,然后查询的时候解析出当前用户所有可能性,拿这个list去查询。
15. 工作流最基本要有的接口
部署流程、发起流程 、审批通过、审批拒绝、查询待审批、查询已审批、查询详情
16. 会签功能
在流程业务管理中,任务是通常都是由一个人去处理的,而多个人同时处理一个任务,这种任务我们称之为会签任务。
会签的种类:按数量通过、按比例通过、一票通过、一票否决
multi instance
17. activiti 配置
千万记得在spring中配置,否则历史数据表会一直没数据
activiti:
database-schema-update: update
db-history-used: true
copy-variables-to-local-for-tasks: false
history-level: full
- database-schema-update: update:这个参数指定了Activiti引擎在启动时如何更新数据库模式。在这种情况下,如果数据库中不存在所需的表,Activiti引擎会尝试创建它们。如果表已经存在,引擎将尝试更新它们以匹配最新的流程定义。这通常用于开发和测试环境,在生产环境中通常会设置为"none"以禁用数据库模式更新
- db-history-used: true:这个配置参数控制是否启用历史记录功能。当设置为true时,Activiti会记录执行过程中的历史数据,包括流程实例、任务、变量等。这些历史数据对于审计、报告和分析非常有用。
- copy-variables-to-local-for-tasks: false:这个配置参数用于控制是否将流程变量复制到任务的本地变量中。当设置为false时,流程变量将保持全局,而在任务执行期间不会自动复制到任务本地。这可以影响任务的可见性和可编辑性。
- history-level: full:这个配置参数定义了历史记录级别。在此示例中,历史记录级别设置为"full",表示要记录完整的历史数据,包括流程实例、任务、变量等。其他可能的选项包括"none"(不记录历史数据)、"activity"(只记录活动的流程实例)和"audit"(只记录审计信息)。
18. git pull 报错:Error merging: unable to unlink old 'xxx.jar': Invalid argument
这是因为当前jar包正在使用,将当前服务停止再pull一下就可以了。
19. activiti流程定义挂起,流程实例会不会挂起
在Activiti中,挂起流程定义与挂起流程实例是两个不同的概念。
- 挂起流程定义(Suspend Process Definition):
- 当你挂起一个流程定义时,意味着不允许新的流程实例基于该挂起的定义启动。
- 已经在运行的流程实例不会受到流程定义的挂起影响,它们会继续执行直到完成或终止。
- 如果你在流程定义被挂起期间尝试启动一个新流程实例,将会抛出异常。
- 挂起流程实例(Suspend Process Instance):
- 当你挂起一个流程实例时,意味着暂停了该实例的执行,但不会影响流程定义或其他流程实例。
- 挂起流程实例通常用于暂停一个特定的流程执行,例如,当需要进行审查或其他操作时。
所以,当你挂起一个流程定义时,已经在运行的流程实例不会被自动挂起,它们将继续执行。如果你想暂停特定的流程实例,你需要单独挂起这些实例。
20. activiti删除流程定义,正在执行的流程实例会怎样
错误号: -6607
错误消息: 违反引用约束[ACT_FK_EXE_PROCDEF]
如果试图删除会报如上错误,有外键应该是。
21. antv
数据可视化组件,各种功能都有,例如画bpmn流程图。
22. java 自动生成的serialVersionUID
Serializable 是 Java 中一个标记接口,用于标识类的对象可以被序列化,也就是可以被转换成字节流,以便在网络传输或永久存储时使用。序列化是一种将对象转换为字节流的过程,而反序列化则是将字节流重新转换为对象的过程。这对于在不同的Java应用程序之间传输对象数据或将对象保存到磁盘上的文件中非常有用。
在Java中,serialVersionUID是用于序列化对象的版本标识符。它是一个64位的long类型数字,用于确保序列化和反序列化操作之间的版本一致性。serialVersionUID的生成是基于类的结构和成员,通常是以下因素的组合:
- 类的名称:serialVersionUID的一部分是基于类的完全限定名称(包括包路径),确保不同包中的类有不同的标识符。
- 类的结构:类的字段、方法、构造函数等结构也会被用于生成serialVersionUID,以便在类结构发生变化时能够检测到版本差异。
- 类的继承关系:父类和接口的结构也可能会影响serialVersionUID的生成,以便检测到继承关系的变化。
- 其他因素:可能还包括一些编译器和JVM的实现细节,以确保生成的标识符足够唯一。
生成的serialVersionUID通常是不可读的,它的主要作用是在序列化和反序列化过程中检测类版本的一致性。如果两个对象的serialVersionUID不匹配,反序列化操作可能会失败并引发InvalidClassException。
需要注意的是,虽然Java可以自动生成serialVersionUID,但在某些情况下,特别是在涉及到版本控制的应用中,手动设置serialVersionUID是一个良好的做法,以确保更好地控制版本标识符。手动设置时,可以使用private static final long serialVersionUID = <某个值>来明确指定serialVersionUID的值。这个值可以是开发者根据需要选择的任何64位long类型的数字。手动设置后,当类的结构发生变化时,可以根据需要手动更新serialVersionUID,以反映类版本的变化。这可以帮助在进行对象序列化和反序列化时更好地管理版本兼容性。
23. activiti可以设置流程变量的时刻
启动流程实例时
任务办理时
通过当前流程实例设置
通过当前任务设置
24. multi instance activiti会签
放个图吧,一图胜千言
25. 为什么我启动流程实例会在ACT_RU_EXECUTION生成两条记录
在Activiti流程引擎中,一个流程实例在执行过程中会在ACT_RU_EXECUTION表中生成多条记录的情况是正常的,通常情况下会生成两条记录。这是因为Activiti使用了一个称为"执行对象"(Execution)的概念来表示流程实例的执行状态,而每个流程实例通常都有两个主要的执行对象,即"根执行对象"(Root Execution)和"当前执行对象"(Current Execution)。
- 根执行对象(Root Execution):根执行对象代表整个流程实例的执行,它与流程实例一一对应,通常在ACT_RU_EXECUTION表中以一条记录表示。根执行对象记录了流程实例的基本信息,如流程定义ID、流程实例ID等。
- 当前执行对象(Current Execution):当前执行对象表示流程实例当前所处的活动节点或任务。在ACT_RU_EXECUTION表中,通常以一条记录表示当前执行对象。当流程实例执行到一个新的节点或任务时,会生成一个新的当前执行对象记录,同时更新原来的当前执行对象记录的状态。这样可以跟踪流程实例的执行位置和状态。
所以,正常情况下,一个流程实例在ACT_RU_EXECUTION表中会有两条记录,一条用于表示根执行对象,另一条用于表示当前执行对象。这种设计使得Activiti能够有效地管理和跟踪流程实例的执行状态,以及支持流程实例的并发执行。
如果你在启动流程实例后看到更多的记录,可能是因为流程中包含了子流程或并行分支,这些情况下会导致额外的执行对象记录。不过,这些额外的记录通常也会与根执行对象和当前执行对象有关联,并在流程执行过程中动态生成和更新。如果有特定的情况需要更详细的解释,可以提供更多的上下文信息,我会尽量帮助解释。
26. minio
27. 软件设计原则
开闭原则、合成复用原则、接口隔离原则、单一职责原则、里氏替换原则、迪米特法则、依赖倒置原则
依赖倒置原则为什么不直接叫依赖抽象?
"依赖倒置原则" 之所以被称为 "依赖倒置",而不是 "依赖抽象",是因为它强调了依赖关系的颠倒和改变传统的依赖方向。这个原则的核心思想是将原本应该是高层模块对低层模块的依赖,颠倒为低层模块依赖于高层模块的抽象。这个颠倒的过程被称为 "倒置",因此得名 "依赖倒置原则"。
28. activiti查询流程实例任务变量
HistoricTaskInstanceQuery query = this.historyService.createHistoricTaskInstanceQuery()
.includeProcessVariables()
.includeTaskLocalVariables() // 加上这个就ok了
.processDefinitionKey(defKey)
.taskAssigneeIds(assigneeList)
.unfinished()
.orderByTaskCreateTime()
.desc();
29. spring中ApplicationContextAware
在Spring框架中,ApplicationContextAware 是一个接口,用于表示一个类可以获取对Spring应用程序上下文(ApplicationContext)的引用。当一个类实现了ApplicationContextAware接口,并在Spring容器中被管理时,Spring会自动将ApplicationContext的引用注入到这个类中,以便在需要时可以访问应用程序上下文的功能。
该接口定义了一个方法setApplicationContext(ApplicationContext applicationContext),当Spring容器实例化并初始化实现了这个接口的Bean时,容器会调用这个方法,将应用程序上下文的引用传递给该Bean。这使得Bean可以在运行时访问和使用Spring应用程序上下文中的各种服务和组件,例如其他Bean、配置属性、AOP代理等。
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class MyBean implements ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
/**
* 用类来获取bean
*/
public static <T> T getBean(Class<T> c){
return applicationContext.getBean(c);
}
}
30. 关于activiti监听器
public class MyListener implements ExecutionListener {
private XXXXService xxxxService;
// 这么写是可以正常工作的
public MyListener() {
xxxxService = BaseHolder.getBean(XXXXService.class);
}
在Activiti中,监听器通常是根据配置在流程执行期间动态加载和执行的,而不是在流程引擎初始化时预先加载的。这意味着每次触发监听器事件时,都会创建一个新的监听器实例并执行其构造方法。 这不会导致线程安全问题,因为每个流程实例都有自己的监听器实例,不会共享状态。
31. 如果我的类中的字段都是基本类型和String类型,那么浅克隆克隆出来的对象修改,会不会影响到原对象
如果你的类中的字段都是基本类型(如 int, double, boolean 等)和 String 类型,那么浅克隆所创建的对象修改不会影响到原对象。这是因为基本类型和String都是不可变的,任何修改都会生成新的实例,而不会影响原始对象或克隆对象。
浅克隆只会复制字段的值(基本类型和 String 引用),因此修改克隆对象的字段值不会影响原对象,反之亦然。这种情况下,浅克隆是安全的,因为不会发生对象之间的共享状态。
32. @Transactional如果不指定rollbackFor会怎样
@Transactional 注解是 Spring 框架中用于声明事务性方法的注解,它用于指定哪些方法应该在事务管理下执行。如果在使用 @Transactional 注解时不指定 rollbackFor 属性,Spring 会有一个默认的回滚策略,即只有未受检查异常(unchecked exceptions)会导致事务回滚。
未受检查异常是继承自 RuntimeException 的异常,它们通常是编程错误或系统故障的结果,例如 NullPointerException、IllegalArgumentException、DataAccessException 等。当方法抛出未受检查异常时,Spring 默认会回滚事务,不需要额外配置。
但是,对于已受检查异常(checked exceptions),它们不会触发默认的事务回滚。已受检查异常通常是程序在正常运行过程中可以处理的异常,例如 IOException、SQLException 等。如果你的事务方法抛出已受检查异常而没有指定 rollbackFor 属性,那么 Spring 不会自动回滚事务,而是将异常传播给调用者,由调用者来处理。
这就是为什么在使用 @Transactional 注解时通常建议明确指定 rollbackFor 属性。通过指定需要触发事务回滚的异常类型,你可以更精确地控制事务的行为。
33. 开源协议
34. 达梦数据库VARCHAR
昨天数据库插入数据报错了,看日志发现字符串截断错误,也就是超长了。我截取的长度是2000,但是数据库设置的就是2000。再测试,发现一个汉字占用3精度,精度应该是以字节为单位的,坑啊。