是否有 Java 类 用于 Camunda Rest 回复?
Are there Java classes for Camunda Rest responses?
我目前正在尝试使用 camunda rest api.
设置从 Spring 到我的本地 camunda 实例的 REST 调用
我是这样设置的:
在我的 localhost:8080
上启动了本地 camunda docker 容器,如下所示:https://hub.docker.com/r/camunda/camunda-bpm-platform
(我已经测试了与邮递员的通话,他们正在工作)
在我的 pom.xml
:
中使用几个 camunda 和 rest 依赖项构建了一个 maven 项目
<dependency>
<groupId>org.camunda.bpm.springboot</groupId>
<artifactId>camunda-bpm-spring-boot-starter</artifactId>
<version>3.3.1</version>
</dependency>
<dependency>
<groupId>org.camunda.bpm</groupId>
<artifactId>camunda-engine-rest-core</artifactId>
<version>7.11.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.projectreactor</groupId>
<artifactId>reactor-spring</artifactId>
<version>1.0.1.RELEASE</version>
</dependency>
- 编写了一个简单的服务来从 Spring 进行休息调用(取自 https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-webclient):
import org.camunda.bpm.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;
@Service
public class MyExampleService {
private final WebClient webClient;
public MyExampleService (WebClient.Builder webClientBuilder) {
this.webClient = webClientBuilder.baseUrl("http://localhost:8080").build();
}
@Override
public ProcessDefinitionEntity[] getCamundaProcesses() {
ProcessDefinitionEntity[] myResponse = this.webClient.get().uri("/engine-rest/process-definition/")
.retrieve()
.onStatus(HttpStatus::is4xxClientError, response -> {
System.out.println("4xx eror");
return Mono.error(new RuntimeException("4xx"));
})
.onStatus(HttpStatus::is5xxServerError, response -> {
System.out.println("5xx eror");
return Mono.error(new RuntimeException("5xx"));
})
.bodyToMono(ProcessDefinitionEntity[].class)
.block();
return myResponse;
}
所以我基本上使用 Spring WebClient 对 localhost:8080/engine-rest/deployment/
进行休息调用,这应该给我一个所有进程的列表,如 JSON(根据 https://docs.camunda.org/manual/latest/reference/rest/deployment/get-query/) .
现在,当我将响应直接转换为 ProcessDefinitionEntity[] 时,它不会将 JSON 转换为它。我还尝试了来自 camunda Java API (https://docs.camunda.org/javadoc/camunda-bpm-platform/7.11/) 的其他 类,例如 ProcessDefinitionDto
.
类 的 None 似乎很符合我从 camunda 得到的回应。响应如下所示:
[
{
"id": "invoice:1:cdbc3f02-e6a1-11e9-8de8-0242ac110002",
"key": "invoice",
"category": "http://www.omg.org/spec/BPMN/20100524/MODEL",
"description": null,
"name": "Invoice Receipt",
"version": 1,
"resource": "invoice.v1.bpmn",
"deploymentId": "cda115de-e6a1-11e9-8de8-0242ac110002",
"diagram": null,
"suspended": false,
"tenantId": null,
"versionTag": "V1.0",
"historyTimeToLive": 30,
"startableInTasklist": true
},
{
"id": "invoice:2:ce03f66c-e6a1-11e9-8de8-0242ac110002",
"key": "invoice",
"category": "http://www.omg.org/spec/BPMN/20100524/MODEL",
"description": null,
"name": "Invoice Receipt",
"version": 2,
"resource": "invoice.v2.bpmn",
"deploymentId": "cdfbb908-e6a1-11e9-8de8-0242ac110002",
"diagram": null,
"suspended": false,
"tenantId": null,
"versionTag": "V2.0",
"historyTimeToLive": 45,
"startableInTasklist": true
}
]
(这只是 docker 容器中的两个标准进程)
camunda java api 中是否有 类 与 camunda rest api 的响应正确匹配?
PS:
我从 Maven 依赖项(位于 package org.camunda.bpm.engine.rest.dto.repository.ProcessDefinitionDto
)获得的 ProcessDefinitionDto 看起来像这样:
public class ProcessDefinitionDto {
protected String id;
protected String key;
protected String category;
protected String description;
protected String name;
protected int version;
protected String resource;
protected String deploymentId;
protected String diagram;
protected boolean suspended;
protected String tenantId;
protected String versionTag;
protected Integer historyTimeToLive;
protected boolean isStartableInTasklist;
...
邮递员给 http://localhost:8080/engine-rest/process-definition
的回复是这样的:
[
{
"id": "b506eb34-e6b1-11e9-8de8-0242ac110002",
"key": "example_workflow",
"category": "http://bpmn.io/schema/bpmn",
"description": null,
"name": "Just an Example",
"version": 1,
"resource": "example_workflow.bpmn",
"deploymentId": "b503b6e2-e6b1-11e9-8de8-0242ac110002",
"diagram": null,
"suspended": false,
"tenantId": null,
"versionTag": null,
"historyTimeToLive": null,
"startableInTasklist": true
},
{
"id": "invoice:1:cdbc3f02-e6a1-11e9-8de8-0242ac110002",
"key": "invoice",
"category": "http://www.omg.org/spec/BPMN/20100524/MODEL",
"description": null,
"name": "Invoice Receipt",
"version": 1,
"resource": "invoice.v1.bpmn",
"deploymentId": "cda115de-e6a1-11e9-8de8-0242ac110002",
"diagram": null,
"suspended": false,
"tenantId": null,
"versionTag": "V1.0",
"historyTimeToLive": 30,
"startableInTasklist": true
},
{
"id": "invoice:2:ce03f66c-e6a1-11e9-8de8-0242ac110002",
"key": "invoice",
"category": "http://www.omg.org/spec/BPMN/20100524/MODEL",
"description": null,
"name": "Invoice Receipt",
"version": 2,
"resource": "invoice.v2.bpmn",
"deploymentId": "cdfbb908-e6a1-11e9-8de8-0242ac110002",
"diagram": null,
"suspended": false,
"tenantId": null,
"versionTag": "V2.0",
"historyTimeToLive": 45,
"startableInTasklist": true
}
]
您看的是正确的包裹吗? Camunda 代码库中有多个 ProcessDefinitionDto classes。
您要找的那个在 camunda-engine-rest-core.jar
的包 org.camunda.bpm.engine.rest.dto.repository
中
class 看起来像这样,与您的输出完全匹配:
package org.camunda.bpm.engine.rest.dto.repository;
import org.camunda.bpm.engine.repository.ProcessDefinition;
public class ProcessDefinitionDto {
protected String id;
protected String key;
protected String category;
protected String description;
protected String name;
protected int version;
protected String resource;
protected String deploymentId;
protected String diagram;
protected boolean suspended;
protected String tenantId;
protected String versionTag;
protected Integer historyTimeToLive;
protected boolean isStartableInTasklist;
...
中的类
org.camunda.bpm.engine.rest.dto.runtime
<dependency>
<groupId>org.camunda.bpm</groupId>
<artifactId>camunda-engine-rest-core</artifactId>
</dependency>
在你的情况下,它将是 ProcessDefinitionDto
Spring REST 模板的用法示例:
@Service
@Slf4j
public class RuntimeServiceImpl implements RuntimeService {
private final RestTemplate rest;
@Value("${camunda.server.rest.url}")
private String restURL;
public RuntimeServiceImpl(RestTemplateBuilder builder) {
this.rest = builder.build();
}
public ProcessDefinitionDto[] getProcessDefinitions() {
ResponseEntity<ProcessDefinitionDto[]> response = rest.getForEntity(restURL + "process-definition/",
ProcessDefinitionDto[].class);
ProcessDefinitionDto[] processes = response.getBody();
Arrays.stream(processes).forEach(pd -> log.info("Found process definition {} with id {} and key {}", pd.getName(), pd.getId(), pd.getKey()));
return processes;
}
}
完成客户项目:https://github.com/rob2universe/camunda-rest-client
external class client 包含您可以重用的更多接口和 DTO,例如
org.camunda.bpm.client.topic.impl.dto.FetchAndLockRequestDto;
org.camunda.bpm.client.topic.impl.dto.TopicRequestDto;
或者只使用/fork 完整的客户端项目。那里已经为您完成了很多工作。
P.s。以下评论:
响应包括一组具有以下字段的流程定义:
[
{
"id": "AccountOpening:1:a6f88770-0ae7-11ea-9ef3-00155d00d800",
"key": "AccountOpening",
"category": "http://bpmn.io/schema/bpmn",
"description": null,
"name": "Account Opening",
"version": 1,
"resource": "C:\account-opening\target\classes\bpmn\AccountOpening.bpmn",
"deploymentId": "a6cc4747-0ae7-11ea-9ef3-00155d00d800",
"diagram": null,
"suspended": false,
"tenantId": null,
"versionTag": null,
"historyTimeToLive": null,
"startableInTasklist": true
}
包org.camunda.bpm.engine.rest.dto.repository中的目标数据结构包含相同的字段:
public class ProcessDefinitionDto {
protected String id;
protected String key;
protected String category;
protected String description;
protected String name;
protected int version;
protected String resource;
protected String deploymentId;
protected String diagram;
protected boolean suspended;
protected String tenantId;
protected String versionTag;
protected Integer historyTimeToLive;
protected boolean isStartableInTasklist;
...}
如果反序列化失败,请确保您使用的是正确的包(例如 org.camunda.bpm.cockpit.impl.plugin.base.dto)
我目前正在尝试使用 camunda rest api.
设置从 Spring 到我的本地 camunda 实例的 REST 调用我是这样设置的:
在我的
localhost:8080
上启动了本地 camunda docker 容器,如下所示:https://hub.docker.com/r/camunda/camunda-bpm-platform (我已经测试了与邮递员的通话,他们正在工作)在我的
pom.xml
: 中使用几个 camunda 和 rest 依赖项构建了一个 maven 项目
<dependency>
<groupId>org.camunda.bpm.springboot</groupId>
<artifactId>camunda-bpm-spring-boot-starter</artifactId>
<version>3.3.1</version>
</dependency>
<dependency>
<groupId>org.camunda.bpm</groupId>
<artifactId>camunda-engine-rest-core</artifactId>
<version>7.11.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.projectreactor</groupId>
<artifactId>reactor-spring</artifactId>
<version>1.0.1.RELEASE</version>
</dependency>
- 编写了一个简单的服务来从 Spring 进行休息调用(取自 https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-webclient):
import org.camunda.bpm.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;
@Service
public class MyExampleService {
private final WebClient webClient;
public MyExampleService (WebClient.Builder webClientBuilder) {
this.webClient = webClientBuilder.baseUrl("http://localhost:8080").build();
}
@Override
public ProcessDefinitionEntity[] getCamundaProcesses() {
ProcessDefinitionEntity[] myResponse = this.webClient.get().uri("/engine-rest/process-definition/")
.retrieve()
.onStatus(HttpStatus::is4xxClientError, response -> {
System.out.println("4xx eror");
return Mono.error(new RuntimeException("4xx"));
})
.onStatus(HttpStatus::is5xxServerError, response -> {
System.out.println("5xx eror");
return Mono.error(new RuntimeException("5xx"));
})
.bodyToMono(ProcessDefinitionEntity[].class)
.block();
return myResponse;
}
所以我基本上使用 Spring WebClient 对 localhost:8080/engine-rest/deployment/
进行休息调用,这应该给我一个所有进程的列表,如 JSON(根据 https://docs.camunda.org/manual/latest/reference/rest/deployment/get-query/) .
现在,当我将响应直接转换为 ProcessDefinitionEntity[] 时,它不会将 JSON 转换为它。我还尝试了来自 camunda Java API (https://docs.camunda.org/javadoc/camunda-bpm-platform/7.11/) 的其他 类,例如 ProcessDefinitionDto
.
None 似乎很符合我从 camunda 得到的回应。响应如下所示:
[
{
"id": "invoice:1:cdbc3f02-e6a1-11e9-8de8-0242ac110002",
"key": "invoice",
"category": "http://www.omg.org/spec/BPMN/20100524/MODEL",
"description": null,
"name": "Invoice Receipt",
"version": 1,
"resource": "invoice.v1.bpmn",
"deploymentId": "cda115de-e6a1-11e9-8de8-0242ac110002",
"diagram": null,
"suspended": false,
"tenantId": null,
"versionTag": "V1.0",
"historyTimeToLive": 30,
"startableInTasklist": true
},
{
"id": "invoice:2:ce03f66c-e6a1-11e9-8de8-0242ac110002",
"key": "invoice",
"category": "http://www.omg.org/spec/BPMN/20100524/MODEL",
"description": null,
"name": "Invoice Receipt",
"version": 2,
"resource": "invoice.v2.bpmn",
"deploymentId": "cdfbb908-e6a1-11e9-8de8-0242ac110002",
"diagram": null,
"suspended": false,
"tenantId": null,
"versionTag": "V2.0",
"historyTimeToLive": 45,
"startableInTasklist": true
}
]
(这只是 docker 容器中的两个标准进程)
camunda java api 中是否有 类 与 camunda rest api 的响应正确匹配?
PS:
我从 Maven 依赖项(位于 package org.camunda.bpm.engine.rest.dto.repository.ProcessDefinitionDto
)获得的 ProcessDefinitionDto 看起来像这样:
public class ProcessDefinitionDto {
protected String id;
protected String key;
protected String category;
protected String description;
protected String name;
protected int version;
protected String resource;
protected String deploymentId;
protected String diagram;
protected boolean suspended;
protected String tenantId;
protected String versionTag;
protected Integer historyTimeToLive;
protected boolean isStartableInTasklist;
...
邮递员给 http://localhost:8080/engine-rest/process-definition
的回复是这样的:
[
{
"id": "b506eb34-e6b1-11e9-8de8-0242ac110002",
"key": "example_workflow",
"category": "http://bpmn.io/schema/bpmn",
"description": null,
"name": "Just an Example",
"version": 1,
"resource": "example_workflow.bpmn",
"deploymentId": "b503b6e2-e6b1-11e9-8de8-0242ac110002",
"diagram": null,
"suspended": false,
"tenantId": null,
"versionTag": null,
"historyTimeToLive": null,
"startableInTasklist": true
},
{
"id": "invoice:1:cdbc3f02-e6a1-11e9-8de8-0242ac110002",
"key": "invoice",
"category": "http://www.omg.org/spec/BPMN/20100524/MODEL",
"description": null,
"name": "Invoice Receipt",
"version": 1,
"resource": "invoice.v1.bpmn",
"deploymentId": "cda115de-e6a1-11e9-8de8-0242ac110002",
"diagram": null,
"suspended": false,
"tenantId": null,
"versionTag": "V1.0",
"historyTimeToLive": 30,
"startableInTasklist": true
},
{
"id": "invoice:2:ce03f66c-e6a1-11e9-8de8-0242ac110002",
"key": "invoice",
"category": "http://www.omg.org/spec/BPMN/20100524/MODEL",
"description": null,
"name": "Invoice Receipt",
"version": 2,
"resource": "invoice.v2.bpmn",
"deploymentId": "cdfbb908-e6a1-11e9-8de8-0242ac110002",
"diagram": null,
"suspended": false,
"tenantId": null,
"versionTag": "V2.0",
"historyTimeToLive": 45,
"startableInTasklist": true
}
]
您看的是正确的包裹吗? Camunda 代码库中有多个 ProcessDefinitionDto classes。 您要找的那个在 camunda-engine-rest-core.jar
的包org.camunda.bpm.engine.rest.dto.repository
中
class 看起来像这样,与您的输出完全匹配:
package org.camunda.bpm.engine.rest.dto.repository;
import org.camunda.bpm.engine.repository.ProcessDefinition;
public class ProcessDefinitionDto {
protected String id;
protected String key;
protected String category;
protected String description;
protected String name;
protected int version;
protected String resource;
protected String deploymentId;
protected String diagram;
protected boolean suspended;
protected String tenantId;
protected String versionTag;
protected Integer historyTimeToLive;
protected boolean isStartableInTasklist;
...
org.camunda.bpm.engine.rest.dto.runtime
<dependency>
<groupId>org.camunda.bpm</groupId>
<artifactId>camunda-engine-rest-core</artifactId>
</dependency>
在你的情况下,它将是 ProcessDefinitionDto Spring REST 模板的用法示例:
@Service
@Slf4j
public class RuntimeServiceImpl implements RuntimeService {
private final RestTemplate rest;
@Value("${camunda.server.rest.url}")
private String restURL;
public RuntimeServiceImpl(RestTemplateBuilder builder) {
this.rest = builder.build();
}
public ProcessDefinitionDto[] getProcessDefinitions() {
ResponseEntity<ProcessDefinitionDto[]> response = rest.getForEntity(restURL + "process-definition/",
ProcessDefinitionDto[].class);
ProcessDefinitionDto[] processes = response.getBody();
Arrays.stream(processes).forEach(pd -> log.info("Found process definition {} with id {} and key {}", pd.getName(), pd.getId(), pd.getKey()));
return processes;
}
}
完成客户项目:https://github.com/rob2universe/camunda-rest-client
external class client 包含您可以重用的更多接口和 DTO,例如
org.camunda.bpm.client.topic.impl.dto.FetchAndLockRequestDto; org.camunda.bpm.client.topic.impl.dto.TopicRequestDto;
或者只使用/fork 完整的客户端项目。那里已经为您完成了很多工作。
P.s。以下评论: 响应包括一组具有以下字段的流程定义:
[
{
"id": "AccountOpening:1:a6f88770-0ae7-11ea-9ef3-00155d00d800",
"key": "AccountOpening",
"category": "http://bpmn.io/schema/bpmn",
"description": null,
"name": "Account Opening",
"version": 1,
"resource": "C:\account-opening\target\classes\bpmn\AccountOpening.bpmn",
"deploymentId": "a6cc4747-0ae7-11ea-9ef3-00155d00d800",
"diagram": null,
"suspended": false,
"tenantId": null,
"versionTag": null,
"historyTimeToLive": null,
"startableInTasklist": true
}
包org.camunda.bpm.engine.rest.dto.repository中的目标数据结构包含相同的字段:
public class ProcessDefinitionDto {
protected String id;
protected String key;
protected String category;
protected String description;
protected String name;
protected int version;
protected String resource;
protected String deploymentId;
protected String diagram;
protected boolean suspended;
protected String tenantId;
protected String versionTag;
protected Integer historyTimeToLive;
protected boolean isStartableInTasklist;
...}
如果反序列化失败,请确保您使用的是正确的包(例如 org.camunda.bpm.cockpit.impl.plugin.base.dto)