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

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как отличить нулевые и не предоставленные значения для частичных обновлений в Spring Rest Controller

Сообщение Anonymous »

Я пытаюсь отличить нулевые значения от не предоставленных значений при частичном обновлении объекта с помощью метода запроса 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 ... */
}
Репозиторий My Person (данные Spring):

Код: Выделить всё

@Repository
public interface PersonRepository extends CrudRepository
 {
}
DTO, который я использую:

Код: Выделить всё

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

/* getters and setters ... */
}
Мой весенний контроллер отдыха:

Код: Выделить всё

@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.

Подробнее здесь: https://stackoverflow.com/questions/384 ... dates-in-s
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»