After the official release of Activiti7, it has fully supported integrated development with SpringBoot2.x. We can introduce the coordinates of the integrated development of Activiti7 and SpringBoot into the project, so that SpringBoot can support Activti7 integration. 1. Create a SpringBoot project using IDEA Introduce relevant dependencies in the project's pom.xml file. The specific dependencies are as follows <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>activiti</artifactId> <version>0.0.1-SNAPSHOT</version> <name>activiti</name> <description>Demo project for Spring Boot</description> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter</artifactId> <version>7.0.0.Beta2</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.27</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> 2.application.yml file configuration In order to put the tables generated by Activiti7 into the MySQL database, you need to add relevant configurations in the configuration file application.yml server: port: 8085 spring: application: name: spring-activiti datasource: url: jdbc:mysql://localhost:3306/activiti?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT&nullCatalogMeansCurrent=true Username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver activiti: #1.flase: default value. When activiti starts, it will compare the versions saved in the database table. If there is no table or the versions do not match, an exception #2 will be thrown. true: activiti will update all tables in the database. If the table does not exist, it is automatically created #3.create_drop: Create the table when activiti starts and delete the table when it is shut down (the engine must be shut down manually to delete the table) #4.drop-create: Delete the original old table when activiti starts, and then create a new table (no need to shut down the engine manually) database-schema-update: true #Check whether the history table exists db-history-used: true #Record history level The configurable history levels are none, activity, audit, full history-level: full #Check process files. By default, check the process files in the processes folder under resources. check-process-definitions: false 3. Add SpringSecurity security framework integration configuration After Activiti7 is integrated with SpringBoot, the SpringSecurity security framework is integrated by default, so we need to prepare the relevant user permission configuration information integrated by SpringSecurity 1) Add SecurityUtil class A component added to quickly configure the SpringSecurity security framework. @Component public class SecurityUtil { private Logger logger = LoggerFactory.getLogger(SecurityUtil.class); @Autowired @Qualifier("myUserDetailsService") private UserDetailsService userDetailsService; public void logInAs(String username) { UserDetails user = userDetailsService.loadUserByUsername(username); if (user == null) { throw new IllegalStateException("User " + username + " doesn't exist, please provide a valid user"); } logger.info("> Logged in as: " + username); SecurityContextHolder.setContext(new SecurityContextImpl(new Authentication() { @Override public Collection<? extends GrantedAuthority> getAuthorities() { return user.getAuthorities(); } @Override public Object getCredentials() { return user.getPassword(); } @Override public Object getDetails() { return user; } @Override public Object getPrincipal() { return user; } @Override public boolean isAuthenticated() { return true; } @Override public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException { } @Override public String getName() { return user.getUsername(); } })); org.activiti.engine.impl.identity.Authentication.setAuthenticatedUserId(username); } } This class can be found in the Example officially provided by Activiti7. 2) Add the DemoApplicationConfig class Its role is to implement the configuration of user permissions of the SpringSecurity framework so that we can use user permission information in the system @Configuration public class DemoApplicationConfiguration { private Logger logger = LoggerFactory.getLogger(DemoApplicationConfiguration.class); @Bean public UserDetailsService myUserDetailsService() { InMemoryUserDetailsManager inMemoryUserDetailsManager = new InMemoryUserDetailsManager(); String[][] usersGroupsAndRoles = { {"salaboy", "password", "ROLE_ACTIVITI_USER", "GROUP_activitiTeam"}, {"ryandawsonuk", "password", "ROLE_ACTIVITI_USER", "GROUP_activitiTeam"}, {"erdemedeiros", "password", "ROLE_ACTIVITI_USER", "GROUP_activitiTeam"}, {"other", "password", "ROLE_ACTIVITI_USER", "GROUP_otherTeam"}, {"system", "password", "ROLE_ACTIVITI_USER"}, {"admin", "password", "ROLE_ACTIVITI_ADMIN"}, }; for (String[] user : usersGroupsAndRoles) { List<String> authoritiesStrings = Arrays.asList(Arrays.copyOfRange(user, 2, user.length)); logger.info("> Registering new user: " + user[0] + " with the following Authorities[" + authoritiesStrings + "]"); inMemoryUserDetailsManager.createUser(new User(user[0], passwordEncoder().encode(user[1]), authoritiesStrings.stream().map(s -> new SimpleGrantedAuthority(s)).collect(Collectors.toList()))); } return inMemoryUserDetailsManager; } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } } 4) Create a test class @SpringBootTest @Slf4j class ActivitiApplicationTests { @Autowired private ProcessEngine processEngine; /** * Deployment of process definition */ @Test public void createDeploy() { RepositoryService repositoryService = processEngine.getRepositoryService(); Deployment deployment = repositoryService.createDeployment() .addClasspathResource("diagram/holiday.bpmn")//Add bpmn resources.addClasspathResource("diagram/holiday.png") .name("Leave Application Form Process") .deploy(); log.info("Process deployment id:" + deployment.getName()); log.info("Process deployment name:" + deployment.getId()); } } Running results: Problems encountered: 1) The history table is not generated by default and needs to be configured in application.yml spring: activiti: #Check whether the history table exists db-history-used: true #Record history level The configurable history levels are none, activity, audit, full history-level: full The above is the full content of this article. I hope it will be helpful for everyone’s study. I also hope that everyone will support 123WORDPRESS.COM. You may also be interested in:
|
<<: jQuery achieves large-screen scrolling playback effect
>>: Detailed explanation of referential integrity in SQL (one-to-one, one-to-many, many-to-many)
1. Why write this article? You must have read a l...
In the front-end design draft, you can often see ...
Table of contents Preface 1. Installation 1. Down...
In previous blog posts, I have been focusing on so...
Table of contents Preface Architecture at a Glanc...
Table of contents Purpose of Teleport How Telepor...
This article shares a simple HTML shopping quanti...
Table of contents Importing JavaScript 1. Interna...
When server B (172.17.166.11) is powered on or re...
Since the network requests initiated by native js...
Yesterday when I was implementing the function of...
1. Go to the official website to download the jdk...
Project scenario: When running the Vue project, t...
Table of contents introduce Support Intel CPU Sup...
Table of contents Controller type of k8s Relation...