springboot JPA使用
要为Spring Boot中的Flowable添加JPA支持,增加下列依赖:
<dependency> <groupId>org.flowable</groupId> <artifactId>flowable-spring-boot-starter-jpa</artifactId> <version>${flowable.version}</version> </dependency>
这会加入Spring的配置,以及JPA用的bean。默认使用Hibernate作为JPA提供者。
创建一个简单的实体类:
@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; } }
默认情况下,如果没有使用内存数据库,不会自动创建数据库表。在classpath中创建application.properties文件并加入下列参数:
spring.jpa.hibernate.ddl-auto=update
添加下列类:
public interface PersonRepository extends JpaRepository<Person, Long> { Person findByUsername(String username);}
这是一个Spring存储(repository),提供了直接可用的增删改查。我们添加了通过username查找Person的方法。Spring会基于约定自动实现它(也就是使用names属性)。
现在进一步增强我们的服务:
-
在类上添加@Transactional。请注意,通过上面添加的JPA依赖,之前使用的DataSourceTransactionManager会自动替换为JpaTransactionManager。
-
startProcess增加了任务办理人参数,用于查找Person,并将Person 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现在为:
@Beanpublic CommandLineRunner init(final MyService myService) { return new CommandLineRunner() { public void run(String... strings) throws Exception { myService.createDemoUsers(); } }; }
RestController也有小改动(只展示新方法),以配合上面的改动。HTTP POST现在有了body,存有办理人用户名:
@RestController public class MyRestController { @Autowired private MyService myService; @RequestMapping(value="/process", method= RequestMethod.POST) public void startProcessInstance(@RequestBody StartProcessRepresentation startProcessRepresentation) { myService.startProcess(startProcessRepresentation.getAssignee()); } ... static class StartProcessRepresentation { private String assignee; public String getAssignee() { return assignee; } public void setAssignee(String assignee) { this.assignee = assignee; } }
最后,为了试用Spring-JPA-Flowable集成,我们在流程定义中,将Person JPA对象的id指派为任务办理人:
<userTask id="theTask" name="my task" flowable:assignee="${person.id}"/>
现在可以通过在POST body中提供用户名,启动一个新的流程实例:
curl -H "Content-Type: application/json" -d '{"assignee" : "jbarrez"}' http://localhost:8080/process
也可以使用Person id获取任务列表:
curl http://localhost:8080/tasks?assignee=1 [{"id":"12505","name":"my task"}]
转载请注明:分享牛 » 《Flowable基础二十四 Flowable REST使用》