Java >> Tutorial de Java >  >> Tag >> return

Lombok devuelve nulo como valor de respuesta

Tengo un problema con mis pruebas Api.

Cuando intento obtener datos de api, lombok devuelve nulo como valor de aceptación, pero hay valores con números reales en api.

Captura de pantalla:https://prnt.sc/w98nt2

Mi DTO por la respuesta:

 @Data
 @Builder
 @EqualsAndHashCode
 @NoArgsConstructor
 @AllArgsConstructor
 @JsonIgnoreProperties(ignoreUnknown = true) 
public class PositionStatResponceDto {
private Integer keywordTasksCount;
private Integer doneKeywordTasksCount;
private Integer tasksCount;
private Integer doneTasks;
}

Mis pasos que extraen el cuerpo y envían una solicitud de publicación Clase pública PositionSteps {

PositionsController positionsController = new PositionsController();

@Step("Post body with url: http://prod.position.bmp.rocks/api/aparser/get-statistic")
public PositionStatResponceDto postBody(PositionStatDto positionStatDto) {
    return positionsController
            .getStatistic(positionStatDto)
            .statusCode(200)
            .extract().body().as(PositionStatResponceDto.class);
}


}

La respuesta de Api json se está obteniendo correctamente. significa que la solicitud funciona bien:

  {
"period": {
    "20201224": {
        "startTime": "2020-12-24 00:00:19",
        "endTime": "2020-12-24 06:39:30",
        "totalRequestsCount": 0,
        "totalQueriesCount": 161887,
        "totalQueriesDoneCount": 161887,
        "totalFailCount": 161,
        "successfulQueries": 161726,
        "proxiesUsedCount": 6.49,
        "retriesUsedCount": 0,
        "avgSpeed": 13.74,
        "tasksCount": 1537,
        "doneTasks": 1537,
        "keywordTasksCount": 725,
        "doneKeywordTasksCount": 725,
        "runTime": "06:39:11",
        "avgTimePerKeyword": 0.15,
        "keywordsLost": 0.1
    }
},
"avg": {
    "totalRequestsCount": 0,
    "totalQueriesCount": 161887,
    "totalQueriesDoneCount": 161887,
    "totalFailCount": 161
}
}

Hice una solicitud de publicación de manera similar a la API:

           {
"success": 1,
"data": {
    "45.90.34.87:59219": [
        "http"
    ],
    "217.172.179.54:39492": [
        "http"
    ],
    "144.76.108.82:35279": [
        "http"
    ],
    "5.9.72.48:43210": [
        "http"
    ],
    "144.76.108.82:47165": [
        "http"
    ],
    "45.90.34.87:57145": [
        "http"
    ],
    "144.76.108.82:53108": [
        "http"
    ], 
         ... 
            } }

Y funciona correctamente con dto:

        @Data
        @Builder
        @EqualsAndHashCode(exclude = "success")
        @NoArgsConstructor
        @AllArgsConstructor
        @JsonIgnoreProperties(ignoreUnknown = true)
        public class AparsersResponceDto {
        private Integer success;
        private Map<String, List<String>> data;
            }

Ayudame por favor. No puedo entender qué está mal con el primer ejemplo. Cada uno de los valores Dto devuelve 'nulo'.

Respuesta

Su DTO no coincide con la estructura de la respuesta que está analizando. Tiene una estructura anidada donde en DTO espera solo recibir valores primitivos. En el nivel superior tienes una estructura con dos campos.

{
   "period": {...},
   "avg": {...}
}

Del ejemplo, asumiría que period es un par clave-valor de fechas como clave y su PositionStatResponceDto como valor.

{
  "period" : {
     "20201224": { <-- nested key with a value matching your DTO
         PositionStatResponceDto 
      }
   ...
}

Entonces, esto significa que solo un elemento en los pares clave-valor coincide con el DTO que ha definido, pero ignora todos los demás elementos de la estructura anidada. Para esto, tendría sentido introducir un nuevo contenedor DTO para manejar la estructura anidada. Por ejemplo,

public class StatDTO {
    private Map<String,PositionStatResponceDto> period;
    //add avg if needed
}

Etiqueta Java