java—dto中是否需要setter来通过SpringWeb客户端解析api json响应?

bhmjp9jg  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(331)

我正在开发一个应用程序,在该应用程序中调用api,检索响应并将其解析为dto。我定义的响应如下所示,

@Getter
@JsonIgnoreProperties(ignoreUnknown = true)
public class ObservationsResponse {
    private Integer count;
    private Long retrieval_date;
    private List<Observation> observations;
}

我只定义了getter,因为我只需要在解析api响应后填充dto之后获取属性。
接下来的问题是,我是否也需要在这里定义setter,以便我的web客户端可以解析对dto的响应。web客户机是否使用setter来设置相关属性,或者是通过其他机制来完成的(我不认为可以通过这里的反射来完成,因为这是我们尝试访问的字段,如果我错了请纠正我)。
我在用SpringWeb客户端处理api请求,

webClient.get().uri(uri).retrieve()
                .onStatus(httpStatus -> !HttpStatus.OK.is2xxSuccessful(), ClientResponse::createException)
                .bodyToMono(ReviewPageResponse.class)
                .retryWhen(Constant.RETRY_BACKOFF_SPEC)
                .block();
g52tjvyc

g52tjvyc1#

您必须提供一种实际设置值的方法。
大多数编解码器都支持javabean约定,即使用默认构造函数,并使用setter来设置值。
对于json,springwebclient使用jackson2jsondecoder,它也支持替代方案,但这需要一些额外的代码。
例如,如果使用@jsoncreator,则不需要设置器:

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;

@Getter
@JsonIgnoreProperties(ignoreUnknown = true)
public class GenericHttpError {

  @JsonCreator
  public GenericHttpError(@JsonProperty("type") String type, @JsonProperty("message") String message,
        @JsonProperty("causes") List<String> causes, @JsonProperty("code") int code,
        @JsonProperty("details") List<Detail> details) {

    this.type = type;
    this.message = message;
    this.causes = causes;
    this.code = code;
    this.details = details;
  }

相关问题