So unterscheiden Sie zwischen Null- und nicht bereitgestellten Werten für Teilaktualisierungen in Spring Rest Controller

Beim teilweisen Aktualisieren einer Entität mit der PUT-Anforderungsmethode in Spring Rest Controller wird versucht, zwischen Nullwerten und nicht bereitgestellten Werten zu unterscheiden.

Betrachten Sie als Beispiel die folgende Entität:

@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 Repository (Frühlingsdaten):

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

The DTO ich benutze:

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);
    }
}

Anfrage mit fehlender Eigenschaft

{"firstName": "John"}

Erwartetes Verhalten: updatefirstName= "John" (verlassenlastName unverändert).

Request with null property

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

Erwartetes Verhalten: updatefirstName="John" und setlastName=null.

Ich kann zwischen diesen beiden Fällen nicht unterscheiden, dalastName im DTO ist immer auf @ gesetnull von Jackson.

Hinweis: Ich weiß, dass REST-Best Practices (RFC 6902) die Verwendung von PATCH anstelle von PUT für Teilaktualisierungen empfehlen, aber in meinem speziellen Szenario muss PUT verwendet werden.

Antworten auf die Frage(8)

Ihre Antwort auf die Frage