【问题标题】:RestTemplate Post and response ( JSON ) Spring bootRestTemplate 发布和响应(JSON)Spring boot
【发布时间】: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 对象,我也尝试使用 postForObjectpostForEntity

【问题讨论】:

  • 您的结果对象似乎有一个嵌套的结果字段,即 "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


【解决方案1】:

问题是您收到的 JSON 响应的结构与您用于反序列化的 AssistenzaResponse 类的结构不匹配。因此,RestTemplate 无法将 JSON 响应正确转换为 AssistenzaResponse 对象。

您可以通过更改 AssistenzaResponse 类以匹配您收到的 JSON 响应的结构来解决此问题。在您的情况下,您需要向 AssistenzaResponse 类再添加一层嵌套。这可以完成,例如,如下:

@Getter
@Setter
@NoArgsConstructor
public class AssistenzaResponse {
    private boolean success;
    private String error;
    private Results results;

    @Getter
    @Setter
    @NoArgsConstructor
    public static class Results {
        private Content content;

        @Getter
        @Setter
        @NoArgsConstructor
        public static class Content {
            private String name;
            private String html;
            private Meta meta;
            private float duration;
            private float statusCode;
            private boolean success;
            private String error;

            @Getter
            @Setter
            @NoArgsConstructor
            public static class Meta {
                private String src;
            }
        }
    }
}

然后,您可以像以前一样在调用 RestTemplate.exchange() 时使用 AssistenzaResponse 而不是 String:

ResponseEntity<AssistenzaResponse> response = restTemplate.exchange(url, HttpMethod.POST, entity, AssistenzaResponse.class);
return response.getBody();

RestTemplate 现在应该正确地将 JSON 响应转换为 AssistenzaResponse 对象。尝试一下!

【讨论】:

  • 我试过了,它有效,谢谢你的回答。我学到了一些新东西。
猜你喜欢
  • 2013-04-30
  • 2020-08-26
  • 2019-05-19
  • 2020-06-25
  • 2017-10-30
  • 1970-01-01
  • 1970-01-01
  • 2018-12-01
  • 2017-11-13
相关资源
最近更新 更多