Activiti 7 集成Spring (二)

这是我参与更文挑战的第14天,活动详情查看: 更文挑战

JPA 支持

要在 Spring Boot 中为 Activiti 添加 JPA 支持,请添加以下依赖项:

<dependency>
	<groupId>org.activiti</groupId>
	<artifactId>activiti-spring-boot-starter-jpa</artifactId>
	<version>${activiti.version}</version>
</dependency>
复制代码

这将添加 Spring 配置和 bean 以使用 JPA。默认情况下,JPA 提供程序将是 Hibernate。

让我们创建一个简单的实体类:

@Entity
class Person {

    @Id
    @GeneratedValue
    private Long id;

    private String username;

    private String firstName;

    private String lastName;

    private Date birthDate;

    public Person() {
    }

    public Person(String username, String firstName, String lastName, Date birthDate) {
        this.username = username;
        this.firstName = firstName;
        this.lastName = lastName;
        this.birthDate = birthDate;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public Date getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(Date birthDate) {
        this.birthDate = birthDate;
    }
}
复制代码

默认情况下,当不使用内存数据库时,不会自动创建表。在类路径上创建一个文件application.properties并添加以下属性:

spring.jpa.hibernate.ddl-auto=更新
复制代码

添加以下类:

public interface PersonRepository extends JpaRepository<Person, Long> {

    Person findByUsername(String username);

}
复制代码

这是一个 Spring 存储库,它提供了开箱即用的 CRUD。我们添加了通过用户名查找 Person 的方法。Spring 将根据约定(即使用的属性名称)自动实现这一点。

我们现在进一步加强我们的服务:

通过将@Transactional添加到类中。请注意,通过添加上面的 JPA 依赖项,我们之前使用的 DataSourceTransactionManager 现在被 JpaTransactionManager 自动换出。

该startProcess现在得到的受让人的用户名,这是用来查找的人,把人JPA对象作为流程实例的过程变量。

添加了创建虚拟用户的方法。这在 CommandLineRunner 中用于填充数据库。

@Service
@Transactional
public class MyService {

    @Autowired
    private RuntimeService runtimeService;

    @Autowired
    private TaskService taskService;

    @Autowired
    private PersonRepository personRepository;

    public void startProcess(String assignee) {

        Person person = personRepository.findByUsername(assignee);

        Map<String, Object> variables = new HashMap<String, Object>();
        variables.put("person", person);
        runtimeService.startProcessInstanceByKey("oneTaskProcess", variables);
    }

    public List<Task> getTasks(String assignee) {
        return taskService.createTaskQuery().taskAssignee(assignee).list();
    }

    public void createDemoUsers() {
		 if (personRepository.findAll().size() == 0) {
            personRepository.save(new Person("jbarrez", "Joram", "Barrez", new Date()));
            personRepository.save(new Person("trademakers", "Tijs", "Rademakers", new Date()));
        }
    }

}
复制代码

CommandLineRunner 现在看起来像:

@Bean
public CommandLineRunner init(final MyService myService) {

	return new CommandLineRunner() {
    	public void run(String... strings) throws Exception {
        	myService.createDemoUsers();
        }
    };

}
复制代码

RestController 也略有更改以合并上述更改(仅显示新方法),并且 HTTP POST 现在具有包含受让人用户名的正文:

@RestController
公共类 MyRestController {

    @自动连线
    私人 MyService myService;

    @RequestMapping(value="/process", method= RequestMethod.POST)
    public void startProcessInstance(@RequestBody StartProcessRepresentation startProcessRepresentation) {
        myService.startProcess(startProcessRepresentation.getAssignee());
    }

   ...

    静态类 StartProcessRepresentation {

        私人字符串受让人;

        公共字符串 getAssignee() {
            返回受让人;
        }

        公共无效setAssignee(字符串受让人){
            this.assignee = 受让人;
        }
    }
复制代码

最后,为了尝试 Spring-JPA-Activiti 集成,我们使用流程定义中的 Person JPA 对象的 id 分配任务:

<userTask id="theTask" name="my task" activiti:assignee="${person.id}"/>
复制代码

我们现在可以启动一个新的流程实例,在 POST 正文中提供用户名:

curl -H "Content-Type: application/json" -d '{"assignee" : "jbarrez"}' http://localhost:8080/process
复制代码

现在使用人员 ID 获取任务列表:

curl http://localhost:8080/tasks?assignee=1

[{"id":"12505","name":"我的任务"}]
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享