Как различить нулевые и не предоставленные значения для частичных обновлений в Spring Rest Controller

Я пытаюсь различить нулевые значения и не предоставленные значения при частичном обновлении сущности с помощью метода запроса PUT в Spring Rest Controller.

Рассмотрим в качестве примера следующую сущность:

@Entity
private class Person {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /* let's assume the following attributes may be null */
    private String firstName;
    private String lastName;

    /* getters and setters ... */
}

Мой личный репозиторий (Spring Data):

@Repository
public interface PersonRepository extends CrudRepository<Person, Long> {
}

Я использую DTO:

private class PersonDTO {
    private String firstName;
    private String lastName;

    /* getters and setters ... */
}

Мой Spring RestController:

@RestController
@RequestMapping("/api/people")
public class PersonController {

    @Autowired
    private PersonRepository people;

    @Transactional
    @RequestMapping(path = "/{personId}", method = RequestMethod.PUT)
    public ResponseEntity<?> update(
            @PathVariable String personId,
            @RequestBody PersonDTO dto) {

        // get the entity by ID
        Person p = people.findOne(personId); // we assume it exists

        // update ONLY entity attributes that have been defined
        if(/* dto.getFirstName is defined */)
            p.setFirstName = dto.getFirstName;

        if(/* dto.getLastName is defined */)
            p.setLastName = dto.getLastName;

        return ResponseEntity.ok(p);
    }
}

Запрос с отсутствующим свойством

{"firstName": "John"}

Ожидаемое поведение: обновлениеfirstName= "John" (ПокидатьlastName без изменений).

Запрос с нулевым свойством

{"firstName": "John", "lastName": null}

Ожидаемое поведение: обновлениеfirstName="John" и установитьlastName=null.

Я не могу различить эти два случая, так какlastName в DTO всегда установленnull Джексон.

Примечание: я знаю, что лучшие практики REST (RFC 6902) рекомендуют использовать PATCH вместо PUT для частичных обновлений, но в моем конкретном сценарии мне нужно использовать PUT.

Ответы на вопрос(4)

Ваш ответ на вопрос