У меня есть класс домена следующим образом
@Getter
@Setter
public class Student {
private Long id;
private String firstName;
private String lastName;
}
И у меня есть этот контроллер
@RestController
@RequestMapping("/student")
public class StudentController {
@PostMapping(consumes = "application/json", produces = "application/json")
public ResponseEntity<Student> post(@RequestBody Student student) {
//todo save student info in db, it get's an auto-generated id
return new ResponseEntity<>(student, HttpStatus.CREATED);
}
}
Теперь я хочу настроить сериализатор таким образом, чтобы он игнорировал поле id при получении, поэтому я получаю только firstName и lastName, но сериализую его, когда я возвращаю объект вызывающей стороне.
Его легко использовать с Джексоном. Существует аннотация @JsonProperty(access = Access.READ_ONLY), в которой вы можете определить, следует ли де- или сериализовать свойство. Просто поместите эту аннотацию в свое поле id.
@JsonProperty(access = Access.READ_ONLY)
private Long id;
Контроллер:
@PostMapping(consumes = "application/json", produces = "application/json")
public ResponseEntity<Student> post(@RequestBody Student student) {
//here we will see the that id is not deserialized
System.out.println(student.toString());
//here we set a new Id to the student.
student.setId(123L);
//in the response we will see that student will serialized with an id.
return new ResponseEntity<>(student, HttpStatus.CREATED);
}
Requestbody:
{
"id":1,
"firstName": "Patrick",
"lastName" : "secret"
}
Вывод toString ():
Student [id=null, firstName=Patrick, lastName=secret]
Ответ:
{
"id": 123,
"firstName": "Patrick",
"lastName": "secret"
}
P.S. Он также будет работать, если вы не отправите свойство id:
{
"firstName": "Patrick",
"lastName" : "secret"
}