Как игнорировать определенные поля дохода при загрузке Spring?

У меня есть класс домена следующим образом

@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, но сериализую его, когда я возвращаю объект вызывающей стороне.

3
0
1 555
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Его легко использовать с Джексоном. Существует аннотация @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"
}

Другие вопросы по теме