Можно ли определить, присутствуют ли параметры в запросе JSON? - PullRequest
0 голосов
/ 13 марта 2019

В моей базе данных есть таблица action, поэтому у меня есть Action сущность и ActionDTO, которые в основном совпадают.

Сущность:

@Entity
@Table(name = "action")
public class Action {

    @Column(name = "name")
    private String name;

    @Column(name = "start_date")
    private Date startDate;

    @Column(name = "end_date")
    private Date endDate;

    //setters & getters
}

DTO - это:

@JsonInclude(JsonInclude.Include.NON_NULL)
public class ActionDTO {
    private String name;
    private Date startDate;
    private Date endDate;

    //setters & getters
}

В контроллере есть способ обновить action таблицу:

@PutMapping(path = "/action", produces = "application/json; charset=UTF-8")
public ResponseEntity<Object> updateAction(@RequestBody ActionDTO actionDTO) {
    Action action = new Action();

    // setting parameters to Action entity

    actionRepository.save(action);
}

В зависимости от наличия или отсутствия полей startDate и endDate в полезной нагрузке запроса мне нужно определить, нужно ли мне обновлять start_date и end_date в моей базе данных.

Так что, если запрос JSON:

{
    "name" : "action name",
    "startDate" : null,
    "endDate" : null
}

тогда я должен обновить start_date и end_date поля как NULL.

Но если запрос JSON:

{
    "name" : "action name"
}

тогда я не должен обновлять start_date и end_date и оставлять их нетронутыми.

Так можно ли определить, присутствовали ли параметры startDate и endDate в HTTP-запросе? Возможно, Джексон предлагает какое-то решение из коробки?

Ответы [ 2 ]

2 голосов
/ 13 марта 2019

В терминах ObjectMapper пропущенное поле и поле, установленное на null, идентичны.Таким образом, десериализовав String в POJO, вы не сможете увидеть, существует поле или нет.Однако, если это то, что вы хотите сделать, вы можете попробовать десериализовать JSON в Map, например:

@PutMapping(path = "/action", produces = "application/json; charset=UTF-8")
public ResponseEntity<Object> updateAction(@RequestBody Map payload) {
    if(payload.containsKey("")) {
        //Something
    }
}
0 голосов
/ 13 марта 2019

Вы можете использовать ObjectMapper.readTree , чтобы прочитать дерево JsonNode объектов, а затем использовать метод JsonNode.has , чтобы проверить, присутствует ли поле в узле:

@PutMapping(path = "/action", produces = "application/json; charset=UTF-8")
public ResponseEntity<Object> updateAction(@RequestBody String json) {
    Action action = new Action();
    JsonNode jsonNode = objectMapper.readTree(json);
    if (jsonNode.has("startDate")) {
        // fill action object
    }

    actionRepository.save(action);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...