cami-la / credit-application-system

Conheça o Spring Boot. Nesse contexto, explore a linguagem de programação Kotlin e entenda como o projeto Spring Data JPA facilita a criação de aplicativos baseados em Spring que usam tecnologias de acesso a dados.
118 stars 229 forks source link

Problema com atributo instanciado na classe Address #9

Closed jotape-exe closed 1 year ago

jotape-exe commented 1 year ago

Olá Camila tudo bem? Criei essa Issues para discutir sobre a versão que estou desenvolvendo baseado no seu projeto.

em meu projeto a entidade de endereço é coluna a parte, e é representada da seguinte forma:

@Entity
@Table(name = "address")
data class Address (
    @Id
    @Column(nullable = false)
    var cep:String = "",
    @Column
    var localidade: String = "",
    @Column
    var uf:String = ""

)

Em minha implementação decidi consumir os dados de endereço da Api do ViaCEP:

@FeignClient(name = "viacep", url = "https://viacep.com.br/ws")
interface ZipCodeService {
    @GetMapping("/{cep}/json")
    fun findZipCode(@PathVariable cep:String): Address
}

Também vale ressaltar meu metodo para salvar os dados e meu controller:

    private suspend fun saveCustomerCep(customer: Customer): Customer{
        val address = withContext(Dispatchers.IO) {
            val cep = customer.address.cep
            val address = addressRepository.findById(cep).orElseGet {
                val newAddress = zipCodeService.findZipCode(cep)
                addressRepository.save(newAddress)
                newAddress
            }
            address
        }
        customer.address = address
        return customerRepository.save(customer)
    }

Controller:

    @PostMapping
    suspend fun save(@RequestBody @Valid customerDTO: CustomerDTO): ResponseEntity<CustomerView> {
        val customer: Customer = this.customerService.save(customerDTO.toEntity())
        return ResponseEntity.status(HttpStatus.CREATED).body(CustomerView(customer))
    }

Fiz o devido tratamento de exceptions em relação a exceção FeignException.BadRequest, e mesmo assim enfrento um problema com o objeto Address. Quando eu faço a requisição com um CEP válido, o objeto e salvo normalmente, quanto passo um cep com que não condiz com as regras de conter apenas numeros e possuir o lenght = 8 a FeignException.BadRequest é tratada, mas quando eu passo um cep inexistente ocorre o salvamento de um endereço em branco. Como neste exemplo:

{
  "username": "João Pedro",
  "cpf": "53736024690",
  "income": 1234,
  "address": {
    "cep": "",
    "localidade": "",
    "uf": ""
  }
}

Queria saber como impedir o salvamento dos atributos de address dessa maneira.

cami-la commented 1 year ago

Oi, @jotape-exe. Tudo bem?

Primeiramente peço desculpa pela demora do retorno, acabou que esses últimos dias está bem corrigo para mim. :(

Então, sobre o consumo de API externas com Feign Client posso abordar em outro curso.

Para fazer essa implementação, eu teria que modificar algumas classes do projeto original e atrapalharia os outros colegas que estão acompanhando o curso pelo repositório do projeto.

De qualquer forma, conseguiu fazer?

Ah, obrigada pela dica! (:

jotape-exe commented 1 year ago

Oi @cami-la

Eu conseguir resolver sim. Quebrei bastante a cabeça, mas no final ou usei o @NotEmpty na camada de model =)

De qualquer forma, obrigado pelo feedback!