【发布时间】:2023-02-24 06:03:37
【问题描述】:
我正在用 restTemplate 实现一个帖子,主体是一个代表 json 字段的对象,我想要一个 object 代表答案本身的 json 字段的答案。
例如json是这样的:
{
"content": {
"name": "support-callmebackmodals-view_web",
"data": {
"channel": "web",
"productName": "book"
}
}
}
代表它的类是这样的:
@Getter
@Setter
@NoArgsConstructor
public class Request {
Con ContentObject;
}
ConClass包含json的“内容”,内容包含姓名和DataClassecc。
转换为我创建的对象的响应是:
@Getter
@Setter
@NoArgsConstructor
@ToString
public class AssistenzaResponse {
private boolean success;
private String error;
Results results;
}
@Getter
@Setter
@NoArgsConstructor
public class Results {
Content content;
}
@Getter
@Setter
@NoArgsConstructor
public class Content {
Meta meta;
private String name;
private String html;
private float duration;
private float statusCode;
private boolean success;
private String error;
}
@Getter
@Setter
@NoArgsConstructor
public class Meta {
private String src;
}
我的service 是这样的:
@Service
public class AssistenzaService {
public AssistenzaResponse getUno() throws IOException {
String url = "https://support.aasdt/batch";
org.apache.http.client.HttpClient client = HttpClientBuilder.create().build();
Request request1 = new Request();
Con con = new Con();
con.setName("support-callmebackmodals-view_web");
Data data = new Data();
data.setChannel("web");
data.setProductName("LibrettoMinori");
con.setData(data);
RestTemplate restTemplate = new RestTemplate();
request1.setContentObject(con);
HttpHeaders headers = new HttpHeaders();
headers.set("Content-Type", "application/json");
headers.set("Accept", "application/json");
HttpEntity<Request> entity = new HttpEntity<>(request1, headers);
try {
ResponseEntity<AssistenzaResponse> response = restTemplate.exchange(url, HttpMethod.POST, entity, AssistenzaResponse.class);
return response.getBody();
} catch (Exception e) {
System.out.println(e.getMessage());
}
return null;
}
}
但答案不是我所期望的,因为它返回:
{
"success": true,
"error": null,
"results": {
"results": null
}
}
相反,如果我使用:
ResponseEntity<String> response = restTemplate.exchange(url,HttpMethod.POST, entity, String.class);
响应是正确的,它是:
{
"success": true,
"error": null,
"results": {
"content": {
"name": "support-callmebackmodals-view_web",
"html": "",
"meta": {
"src": "/support/client.js"
},
"duration": 7.694401,
"statusCode": 200,
"success": true,
"error": null
}
}
}
为什么我不能使用我创建的答案对象得到准确的答案?
但是,如果我使用字符串,它会起作用吗?
我希望 json 答案不会作为 String 返回,但作为我的 Response 对象,我也尝试使用 postForObject 和 postForEntity。
【问题讨论】:
-
您的结果对象似乎有一个嵌套的结果字段,即
"results": {"results": null}而您想要的是在结果字段中接收 Content 的实例。我不认为你的帖子显示“结果”类,但我假设一个解决方案是用内容替换对象。因此,将 AssistenzaResponse 中的字段从Results results更改为Content results -
请与我们分享结果类。当我看到你的响应 json 时,你的 Results 类必须有 Content 内容;
-
我把它添加到原来的帖子
-
您能否尝试为内容、元、结果字段添加私有。(私人内容内容;) 因为你使用 lombok 并且据我所知 lombok 不会为默认修饰符生成 getter-setter 方法。如果没有公共的 getter-setter 方法,映射器将无法工作。
标签: java spring-boot rest resttemplate response-entity