Sto provando a distinguere tra valori nulli e valori non forniti quando si aggiorna parzialmente un'entità con il metodo di richiesta PUT in Spring Rest Controller.Come distinguere tra valori null e non forniti per gli aggiornamenti parziali nel controller Spring Rest
Si consideri il seguente entità, come ad esempio:
@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 ... */
}
mio repository persona (primavera dati):
@Repository
public interface PersonRepository extends CrudRepository<Person, Long> {
}
Il DTO che uso:
private class PersonDTO {
private String firstName;
private String lastName;
/* getters and setters ... */
}
la mia primavera 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);
}
}
richiesta con la proprietà mancante
{"firstName": "John"}
Comportamento previsto: aggiornamento firstName= "John"
(lasciare lastName
invariato).
richiesta con la proprietà nullo
{"firstName": "John", "lastName": null}
Comportamento previsto: aggiornamento firstName="John"
e impostare lastName=null
.
non riesco a distinguere tra questi due casi, poiché lastName
in DTO è sempre impostato su null
da Jackson.
Nota: So che le best practice REST (RFC 6902) raccomandano l'uso di PATCH invece di PUT per gli aggiornamenti parziali, ma nel mio particolare scenario ho bisogno di usare PUT.
Eventuali duplicati di [@RequestBody come differenziare un valore non inviato da un valore nullo?] (Https://stackoverflow.com/questions/40610604/requestbody-how-to-differentiate-an-unsent-value -from-a-null-value) – laffuste