Метод веб-обновления Spring Reactive создает новую запись вместо обновления существующей - PullRequest
1 голос
/ 08 марта 2020

В настоящее время я использую Spring Webflux и MongoDB вместе с набором CRUD REST API. Итак, у меня есть сервисный метод, который принимает идентификатор существующего объекта, обновленного объекта, а затем отображает обновленные данные в существующий. Как здесь:

ServiceImpl. java

@Override
public Mono<Computer> update(String id, Computer computer) {
    return repo.findById(id)
            .switchIfEmpty(Mono.error(new Exception("COMPUTER_NOT_FOUND")))
            .map(c -> computer)
            .flatMap(repo::save);
}

Мой метод REST Controller: EnpointController. java

@PutMapping("/{id}")
public Mono<Computer> updateOneComputer(@PathVariable("id") String id,@Valid @RequestBody Computer parsedBody) {
    return computerService.update(id, parsedBody);
}

Но проблема в следующем: вместо обновления делает новую запись в БД. Я попытался что-то вроде установить индивидуальное поле существующего объекта с обновлением. Работает, обновляет существующий документ, но не эффективно. Это не решение, особенно с внедренным документом в Mon go. Как это:

@Override
public Mono<Computer> update(String id, Computer computer) {
    return repo.findById(id)
            .switchIfEmpty(Mono.error(new Exception("COMPUTER_NOT_FOUND")))
            .map(c -> {
                c.setFoo(computer.getFoo());
                c.setBar(computer.getBar());
                //and so on!
            })
            .flatMap(repo::save);
}

Мои сущности

Компьютер. java

@Document(value = "computers")
@Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
public class Computer extends BaseDocument {

    private String name;
    private String customerId;
    private String computerModel;
    private String computerSpecs;
    private String otherPart;
}

BaseDocument. java

@Data
@NoArgsConstructor
@AllArgsConstructor
public class BaseDocument {

    @Id
    private String id;
    @CreatedDate
    private Date createdDate;
    @LastModifiedDate
    private Date updatedDate;
    @CreatedBy
    private String createdBy;
    @LastModifiedBy
    private String updatedBy;
    private char deleted = 'N';
}

Пожалуйста, помогите и заранее спасибо!

1 Ответ

1 голос
/ 08 марта 2020

Попробуйте это:

.map(c -> {computer.setId(id); return computer;})
...