Я получил ноль от сущности с @Data, когда я использую @Requestbody - PullRequest
0 голосов
/ 09 мая 2018

Я младший веб-разработчик.
Я не понимаю, почему authenticatedPgInfo возвращает NULL
Следующее - мой простой тест.

@RestController
public class InitController {
    @PostMapping("/test")
    public String test(@RequestBody AuthenticatedPgInfo authenticatedPgInfo) {
        return "";
    }
}

И

@Data
public class AuthenticatedPgInfo {
    private int code;
    private String message;
    private List<AuthenticatedPg> result;
}

Если я изменю @Data на @Getter и @Setter, authenticatedPgInfo вернет ноль.
Но когда я удаляю @Data, @Getter ... (аннотацию Lombok) и генерирую геттер и сеттер, тогда это работает !!

Я не понимаю, почему Ломбок не работает в этой ситуации .. Может кто-нибудь помочь?
Заранее спасибо.

test.json

{
  "result": [
    {
       "key": "rabbit",
       "value": "3"
    },
    {
       "key": "lion",
       "value": "1"
    }
  ],
  "message": "success",
  "code": 0
}

Ответы [ 3 ]

0 голосов
/ 09 мая 2018

Примечание @ Data неявно включает @ RequiredArgsConstructor , но не @NoArgsConstructor. Поскольку Джексону не нужен конструктор без аргументов, вам нужно его предоставить. Вы можете сделать это с помощью Lombok, просто добавив @ NoArgsConstructor.

@Data
@NoArgsConstructor
public class AuthenticatedPgInfo {
    private int code;
    private String message;
    private List<AuthenticatedPg> result;
}
0 голосов
/ 11 мая 2018

OMG ... Я совершил ошибку biiiiiiiiiig.
Я не проверял Enable annotation processing в IntelliJ
Весь код все работает как положено. Спасибо, ребята!

0 голосов
/ 09 мая 2018

Прямо сейчас я воспроизвел тот же пример самостоятельно - с аннотацией @Data только все работает, как и ожидалось.

Чтобы сериализовать json для объекта, Джексону нужен конструктор этого объекта по умолчанию (т.е. без каких-либопараметры) или конструктор с параметрами и с аннотацией @JsonCreator.

По умолчанию Lombok создает конструктор по умолчанию, если какой-либо другой не существует.И Джексон использует это.Но, возможно, в вашем случае что-то идет не так, поэтому вы можете создать свой DTO с аннотацией @JsonCreator, например, вот так:

@Data
public class AuthenticatedPgInfo {
    private int code;
    private String message;
    private List<AuthenticatedPg> result;

    @JsonCreator
    public AuthenticatedPgInfo(@JsonProperty("code") in code,  @JsonProperty("mesage") String message, @JsonProperty("result") List<AuthenticatedPg> result) {
        this.code = code;
        this.message = message;
        this.result = result;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...