java - Java REST 客户端 - javax.ws.rs.ProcessingException: javax/xml/bind/annotation/XmlTransient
问题描述
我正在使用 Java 1.7 并尝试创建一个客户端来查询 REST api。
但是,执行客户端时出现以下错误。我在 REST 服务中设置了一个断点,但它永远无法到达。
错误
javax.ws.rs.ProcessingException: javax/xml/bind/annotation/XmlTransient
问题
任何想法我如何修复客户端?
代码
pom.xml
<!-- JAX-RS 2.x Client RI -->
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
</dependency>
客户端.java
import javax.ws.rs.BadRequestException;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
private static final String approvalSubmitUrl = "http://localhost:8081/rest/approvals-status/{evaluationRequestId}";
public Object getStatus(String evaluationRequestId, EvaluationProvidedNotification providedNotification) {
logger.info(approvalSubmitUrl);
EvaluationProvidedNotificationDTO evaluationProvidedNotificationDTO = new EvaluationProvidedNotificationDTO();
map(providedNotification, evaluationProvidedNotificationDTO);
try {
logger.info("Sending request to get status from " + approvalSubmitUrl + " (nexct-approval-service)");
Client client = ClientBuilder.newClient();
WebTarget target = client.target(approvalSubmitUrl);
Response response = target.queryParam("evaluationRequestId", evaluationRequestId)
.request(MediaType.APPLICATION_JSON_TYPE).post(Entity.json(evaluationProvidedNotificationDTO));
StatusResponse statusResponse = response.readEntity(StatusResponse.class);
logger.info("Successfully got the status: " + statusResponse.status );
}
catch (BadRequestException refused) {
logger.error("Request to: " + approvalSubmitUrl + " REFUSED: " + refused.getMessage());
}
catch (Exception e) {
logger.error("Failed to get status from " + approvalSubmitUrl, e);
}
return null;
}
该服务仅供参考,因为我确信错误是客户端错误的结果。
Service.java(使用 Java 14 的 Springboot)
@PostMapping(value = "/rest/approvals-status/{evaluationRequestId}", consumes=MediaType.APPLICATION_JSON_VALUE, produces={MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE})
public @ResponseBody ResponseEntity<StatusDTO> getStatus(@PathVariable String evaluationRequestId, @RequestBody EvaluationProvidedNotificationDTO providedNotificationDTO) {
StatusDTO status = new StatusDTO();
status.setEvaluationRequestId(evaluationRequestId);
if (providedNotificationDTO.outcome == EvaluationProvidedNotificationDTO.Evaluation.Approved) {
if (pendingApprovals(evaluationRequestId)) {
status.setStatus(StatusDTO.Status.Wait);
} else {
status.setStatus(StatusDTO.Status.Proceed);
}
} else {
status.setStatus(StatusDTO.Status.Wait);
}
return ResponseEntity.ok(status);
}
这是要发布的对象:
评估提供通知DTO.java
public class EvaluationProvidedNotificationDTO {
public enum Evaluation {
Approved, Rejected;
}
//any contraints on the request for example cost constraints
public List<Serializable> constraints;
//the outcome of the evaluation
public Evaluation outcome;
//any messages that the evaluator wants to send to the requestor
public String messageToRequestor;
public List<Serializable> getConstraints() {
return constraints;
}
public void setConstraints(List<Serializable> constraints) {
this.constraints = constraints;
}
public Evaluation getOutcome() {
return outcome;
}
public void setOutcome(Evaluation outcome) {
this.outcome = outcome;
}
public String getMessageToRequestor() {
return messageToRequestor;
}
public void setMessageToRequestor(String messageToRequestor) {
this.messageToRequestor = messageToRequestor;
}
}
解决方案
我设法通过将 POJO 转换为 JSON 来解决这个问题:
Invocation.Builder builder = target.request();
Gson gson = new Gson();
String json = gson.toJson(evaluationProvidedNotificationDTO);
Entity entity = Entity.entity(json, MediaType.APPLICATION_JSON_TYPE);
Response response = builder.post(entity);
StatusResponse statusResponse = response.readEntity(StatusResponse.class);
推荐阅读
- hadoop - Hadoop 为什么选择 MapReduce 作为其计算引擎?
- r - 不同 R 包中的 S3 类名冲突
- node.js - Mongoose Populate Virtuals 不工作并返回 null
- spring - 没有发布/刷新的春季云配置
- ios - Cordova iOS:安装新的模拟器镜像
- angular - 显示由 ngFor* Angular 6 生成的行数
- c++ - 用户键入时更新 QTextDocument
- xsd - JSON Schema 验证器“id”字段
- c# - c#连接字符串和连接app.config
- sql - 我可以只从文件备份中恢复 SQL Server 实例吗?