Search code examples
javaspring-bootrestput

handler method in spring boot is saving new record instead of updating already existed record in database for put request


I am trying to update an existing record in my database for a put request in spring boot.

Incoming Request -

enter image description here

Handler method in controller class

  // put method for updating record
    @PutMapping("/accounts/{id}")
    public Account putAccount(@RequestBody Account account, @PathVariable("id") int id) {
        System.out.println(account);
        Account ac = this.accountServices.addAccount(account);
        // save method of crud repository also updates if data is already present
        return ac;
    }

AccountServices class addAccount() method

// add an account
    public Account addAccount(Account account) {
        Account acc = this.accountRepository.save(account);
        return acc;
    }

AccountRepository interface

public interface AccountRepository extends CrudRepository<Account, Integer> {
//custom finder method to get book record with id
}

For every request it is adding new record instead of updating already existing record. Someone please help here.

Adding Account class

@Entity
@Table(name = "Account")
public class Account {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public int accountNumber;
    public String accountType;
    public int balance;

    @ManyToMany(cascade = CascadeType.ALL)
    @JsonManagedReference
    @JsonIgnore 
    private List<Customer> customers;
//skipped constructors, getters and setters
}

Solution

  • Maybe you can try something like that

    private void _setPackAddress(Pack objectPack, Pack pacDao) {
            if (objectPack.getPackageAddress() != null) {
                pacDao.getPackageAddress().setCity(objectPack.getPackageAddress().getCity());
                pacDao.getPackageAddress().setNumber(objectPack.getPackageAddress().getNumber());
                pacDao.getPackageAddress().setPostalCode(objectPack.getPackageAddress().getPostalCode());
                pacDao.getPackageAddress().setStreet(objectPack.getPackageAddress().getStreet());
                
            }
    }
    

    And where can you see from where parameters come

            Pack pacDao = this.packRepository.findById(id).orElseThrow(() -> new OpenApiResourceNotFoundException("Pack not found:: " + id));
    

    not directly like that

    private void _setPackAddress(Pack objectPack, Pack pacDao) {
     if (objectPack.getPackageAddress() != null) {
        pacDao.setPackageAddress(objectPack.getPackageAddress());
     }
    }
    

    I also encountered this problem, but I solved it that way. I hope this post to be helpful for you. Keep coding :-)