这是我参与更文挑战的第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