Como distinguir valores nulos e não fornecidos para atualizações parciais no Spring Rest Controller
Estou tentando distinguir entre valores nulos e valores não fornecidos ao atualizar parcialmente uma entidade com o método de solicitação PUT no Spring Rest Controller.
Considere a seguinte entidade, como um exemplo:
@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 ... */
}
Repositório Minha Pessoa (Spring Data):
@Repository
public interface PersonRepository extends CrudRepository<Person, Long> {
}
O DTO que eu uso:
private class PersonDTO {
private String firstName;
private String lastName;
/* getters and setters ... */
}
My 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);
}
}
Solicitação com propriedade ausente
{"firstName": "John"}
Comportamento esperado: atualizaçãofirstName= "John"
(sairlastName
inalterado).
Pedido com propriedade nula
{"firstName": "John", "lastName": null}
Comportamento esperado: atualizaçãofirstName="John"
E definirlastName=null
.
Não consigo distinguir entre esses dois casos, já quelastName
no DTO está sempre definido comonull
por Jackson.
Nota: Eu sei que as práticas recomendadas de REST (RFC 6902) recomendam o uso de PATCH em vez de PUT para atualizações parciais, mas, no meu cenário específico, preciso usar PUT.