Executando verificação de segurança...
1

[DÚVIDA]deleteById java com jpa

Olá pessoal,
Estou desenvolvendo um API simples para testes com spring, implementando as operações de CRUD, porém quando eu implementei o método delete, eu esperava uma exceção do tipo EmptyResultDataAccessException por default caso o id não existir.
Nesse caso, estou usando padrão camadas, segue abaixo:

[Package]Service
Classe: ProductService.java

public void delete(Long id) {
        try {
                repository.deleteById(id);
        }catch (EmptyResultDataAccessException e) {
                throw new ResourceNotFoundException("id not found");
        }
}

[Package]Resource
Classe ResourceExceptionHandler.java: Centraliza exceções capturadas

@ControllerAdvice
public class ResourceExceptionHandler {

	@ExceptionHandler(ResourceNotFoundException.class)
	public ResponseEntity<StandardError> entityNotFound(ResourceNotFoundException e, HttpServletRequest request){
		StandardError err = new StandardError();
		HttpStatus status = HttpStatus.NOT_FOUND;
		err.setTimestamp(Instant.now());
		err.setStatus(status.value());
		err.setError("Resource not found");
		err.setMessage(e.getMessage());
		err.setPath(request.getRequestURI());
		
		return ResponseEntity.status(status).body(err);
	}
}

Classe: ProductResource.java

@DeleteMapping(value = "/{id}")
public ResponseEntity<Void> delete(@PathVariable Long id){
        service.delete(id);
        return ResponseEntity.noContent().build();
}

Versão do Spring Boot: 3.1.3

Mas o que acontece não é o esperado, pois quando eu tento deletar um id que não existe, o postman retorna "204 - No content",
Postman

Nesse caso tenho certeza que o id 1000 não existe

Minha dúvida é: Esse tipo de retorno está correto? Se sim, alguém poderia por gentileza me explicar o por que? Pois lembro de que nas versões mais antigas do spring ele lançava o EmptyResultDataAccessException quando um id não existente era passado na rota, exemplo: http://localhost:8080/products/1000 (Id inexistente)

Desde já agradeço a atenção!

Carregando publicação patrocinada...
1

Opa, e ai meu nobre!

Se o método deleteById que você está usando for do pacote org.springframework.data.repository a documentação do método fala isso:

/**
 * Deletes the entity with the given id.
 * <p>
 * If the entity is not found in the persistence store it is silently ignored.
 *
 * @param id must not be {@literal null}.
 * @throws IllegalArgumentException in case the given {@literal id} is {@literal null}
*/
void deleteById(ID id);

De acordo com a documentação, o método não retorna exceção caso o item não seja deletado. No máximo ele retorna IllegalArgumentException se o id passado for nulo.

Partindo desta premissa, acho mais seguro você escrever:

public void delete(Long id) {
    if ( ! repository.existsById(id)) 
        throw new ResourceNotFoundException("id not found");
    repository.deleteById(id);
}

Obs: Não esqueça de anotar seu metodo ou classe com @Transactional ;)

Espero ter ajudado de alguma forma!