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. :)