Как создать экземпляр объекта через RestController, не пропуская все поля конструктора через RequestBody? - PullRequest
0 голосов
/ 27 января 2020

У меня есть объект, определенный как:

@Entity
@NoArgsConstructor
public class Task {
    @Id
    @Getter @Setter private Integer id;
    @Getter @Setter private String text;
    @Getter @Setter private Boolean isDone = Boolean.FALSE;

    public Task(int id, String text){
        this.id = id;
        this.text = text;
        this.isDone = Boolean.FALSE;
    }
}

Если я передам {"id:": 1, "text": "buy juice"} в качестве тела запроса, RestController может создать экземпляр задача. Однако я не хочу передавать id в качестве поля в моем теле запроса. Как мне справиться с этим?

1 Ответ

1 голос
/ 27 января 2020

Предполагая, что вы используете MySQL, измените свою сущность, как показано ниже

@Entity
@NoArgsConstructor
@Getter 
@Setter 
public class Task {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String text;
    private Boolean isDone = Boolean.FALSE;

    public Task(int id, String text){
        this.id = id;
        this.text = text;
        this.isDone = Boolean.FALSE;
    }
}

, и тогда ваш запрос изменится на простую передачу текста: {"text":"buy juice" }

Сохранение JPA теперь будет работать следующим образом

  1. Если в запросе присутствует идентификатор, он будет предполагать, что сущность существует, и обновит ее
  2. Если в запросе нет идентификатора, он создаст новую строку в БД и автоматически назначать идентификатор

PS - В зависимости от того, какая у вас БД, вы можете выбрать оптимальную стратегию генерации идентификатора для этой БД. Например, генерация на основе идентичности хорошо работает с MySQL, генерация на основе последовательностей хорошо работает с Oracle дБ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...