盘古BPM体验地址    盘古BPM交流群盘古BPM交流群号:963222735

《Flowable基础二十四 Flowable REST使用》

分享牛 3247℃

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使用》