PUTMAPPING JAVA SPRING BOOT MONGODB REST API — обновление не работает, но создает новую запись

#java #mongodb #spring-boot #microservices #rest

#java #mongodb #spring-boot #микросервисы #rest

Вопрос:

при попытке обновить существующую запись в таблице mongo db, используя PostMapping и запрос PUT, каждый раз, когда я пытаюсь обновить, в таблице создается новая запись..

Ниже приведен мой контроллер кода

 @RestController
@RequestMapping("/expenses")
public class mydataExpController {

@PutMapping("/")
    public mydataExpense updExpenses(@RequestBody mydataExpense exp){
        return expenseServices.updData(exp);
        
}
 

Обслуживание

 @Service
public class ExpenseServices {
    @Autowired
    mydataExpRepository mydataexprepository;

public mydataExpense updData(mydataExpense exp) {
        return mydataexprepository.save(exp);
    }
 

репозиторий

 @Repository
public interface mydataExpRepository extends MongoRepository<mydataExpense, String> {
    

}
 

В postman

 connection →keep-alive
content-type →application/json
date →Tue, 29 Dec 2020 10:54:51 GMT
keep-alive →timeout=60
transfer-encoding →chunked
 

каждый раз, когда я выполняю http://localhost:8080/expenses / с помощью PUT

в базе данных создается новая запись

Комментарии:

1. можете ли вы добавить пример содержимого? Скорее всего, вы неправильно передаете поле id.

2. Пожалуйста, ознакомьтесь с переданным содержимым и ответом

3. { «_id»: «5fedba90e11a563ce37e9890», «expdate»: «12-24-2020», «exptyp»: «Biriyani Hub», «expamt»: 0 }

4. { «expdate»: «12-24-2020», «exptyp»: «Biriyani Hub», «expamt»: 0 }

Ответ №1:

Я думаю, что это создает новый объект, потому что вы просто передаете его прямо в repo.save() .

Сначала вы должны найти существующий myDataExpense и изменить / обновить его, а затем вызвать repository.save() .

К вашему сведению, вы также могли бы сделать что-то подобное с MongoTemplate.

 Query query = Query.query(Criteria.where("<id attribute name of your myDataExpense Document>").is(exp.getId);
Update update = new Update().set(".....$", exp);
mongoTemplate.updateFirst(query, update, myDataExpense.class);