Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Spring Boot - Transactional

Boa noite ,

Estou com dúvida como implementar Transactional para dois Controllers, de forma separadas está funcionando , porém gostaria de reaproveitar e criar o cadastrar unificando esses dados:

class PessoaController

@PostMapping
    @Transactional
    public ResponseEntity<PessoaDto> cadastrar(@RequestBody @Valid PessoaForm form, UriComponentsBuilder uriBuilder) throws ErrorBusinessDto {

        Pessoa pessoa = form.converter();
        isCpfCnpjEstaCadastrado(pessoa.getCpfCnpj());

        pessoaRepository.save(pessoa);
        URI uri = uriBuilder.path("/api/pessoa/{id}").buildAndExpand(pessoa.getId()).toUri();

        return ResponseEntity.created(uri).body(new PessoaDto(pessoa));

    }

JSON

{
    "tipoPessoa":"FISICA",
    "cpfCnpj":"00000000000",
    "razaoSocial":"JOANA OLIVEIRA SILVA",
    "nomeFantasia":"JOANA",
    "siglaApelido":"JO"
}

class EnderecoController

 @PostMapping("/{idPessoa}")
    @Transactional
    public ResponseEntity<Endereco> cadastrar(@RequestBody @Valid EnderecoForm enderecoForm, UriComponentsBuilder uriBuilder, @PathVariable Long idPessoa) throws ErrorBusinessDto {

        Integer codigoIbgeMunicipio = validarCidadeEstadoEhValido(enderecoForm);

        Optional<Pessoa> optional = pessoaRepository.findById(idPessoa);

        if (optional.isPresent()) {
            Endereco endereco = enderecoForm.converter(municipiosRepository, estadosRepository, optional.get(), codigoIbgeMunicipio);
            enderecoRepository.save(endereco);

            URI uri = uriBuilder.path("/api/endereco/{id}").buildAndExpand(endereco.getId()).toUri();
            return ResponseEntity.created(uri).build();

        }
        return ResponseEntity.badRequest().build();

    }

JSON

{
    "tipoEndereco":"RESIDENCIAL",
    "cep":"0000000",
    "logradouro":"Rua Teste",
    "numero":"1",
    "complemento":"",
    "bairro":"Teste",
    "municipio":"São Paulo",
    "estado":"SP"
}

Gostaria de realizar a implementação para cadastro da pessoa mais os seus endereços com JSON abaixo:

{
    "tipoPessoa":"FISICA",
    "cpfCnpj":"00000000000",
    "razaoSocial":"JOANA OLIVEIRA SILVA",
    "nomeFantasia":"JOANA",
    "siglaApelido":"JO",
    "enderecos":[
        {
            "tipoEndereco":"RESIDENCIAL",
            "cep":"0000000",
            "logradouro":"Rua Teste",
            "numero":"1",
            "complemento":"",
            "bairro":"Teste",
            "municipio":"São Paulo",
            "estado":"SP"
        },
        {
            "tipoEndereco":"COBRANCA",
            "cep":"0000000",
            "logradouro":"Rua Teste",
            "numero":"1",
            "complemento":"",
            "bairro":"Teste",
            "municipio":"São Paulo",
            "estado":"SP"
        }
    ]
}

O endereço só pode ser salvo após gerar o ID da pessoa , neste caso qual seria a maneira correta de realizar essa implementação?

Posso no metodo cadastrar() da class PessoaController fazer uma referencia ao metodo de cadastrar() da class EnderecoController ?

Caso ocorra erro como realizar o rollback dos endereços e da pessoa ?

Agradeço. :)

1 resposta
solução!

Resolvido criando a class Service do Endereco.

@Service
public class EnderecoService {

    public Endereco salvar(EnderecoForm enderecoForm, Pessoa pessoa) throws ErrorBusinessDto {
            Integer codigoIbgeMunicipio = validarCidadeEstadoEhValido(enderecoForm);
            validarEnderecoPessoaJaExiste(enderecoForm, pessoa);
            Endereco endereco = enderecoForm.converter(municipiosRepository, estadosRepository, pessoa, codigoIbgeMunicipio);
            enderecoRepository.save(endereco);
            return endereco;
        }
        ...
}