7
respostas

Uma dúvida com método PUT

Estou fazendo um API que esta em camadas, porém eu recebo uma mensagen em TEXTO e não em JSON e estou convertendo e trazendo o resultado normalmente e salvando com POST. Até ai ok o problema é o PUT porque como ele é TEXTO como vou fazer com que ele entenda ID que esta vindo como string como Long?

@Override
    public PidModel update(**String id**, PidModel pid) {        
        messagesRepositoryPid.save(pid);
        return null;
    }
7 respostas

Oi Marcus,

Você diz para converter de String para Long? Se for isso, basta fazer assim:

Long idLong = Long.parseLong(id);

Se tiver outros caracteres na String você precisa remover antes com o método replace da classe String.

Seria Long para String

Vou botar que eu fiz aqui

Nesse caso basta transformar concatenando mesmo:

String idTexto = idLong + "";

Na controller esta assim:

@PutMapping("/{empresa}")
    @ApiOperation(value = "Atualizando menssagens que vem do O4C em HL7 ADT-A08 para HCIS")
    @CrossOrigin(origins = "*")    
    public ResponseEntity<String> put(@RequestBody String hl7msg, @PathVariable String empresa) {

        this.tenantManager.setTenant(empresa);
        serviceHl7.splitHl7(hl7msg, "PUT");
        return ResponseEntity.status(HttpStatus.OK).build();
    }  

Dai ele vai para Serviço que fiz :

case "PID":
                    messages.setPid(linha);
                    PidModel pid = new PidModel();
                    String[] strFieldsPid = extractedPid(messages);
                    addPid(pid, strFieldsPid);
                    if ("PUT".equals(metodo))
                        pidservice.update(pid.getPid_3_patient_Identifier_list(), pid); 
                     //Pidservice.save(pid);
                    break;

                default:
                break;
@Override
    public PidModel update(String id, PidModel pid) {        
        messagesRepositoryPid.save(pid);
        return null;
    }

nesse fical so TEM o SAVE e ele esta Salvando e inserindo gostaria que ele só alterasse.

Entendi.

O problema é que você está instanciando um novo objeto PidModel, no trecho de código que tem o case "PID":. Com isso ao chamar o save, a JPA vai entender que é para inserir um novo registro e não atualizar um registro existente.

O correto é carregar o pid do banco de dados pelo id e setar nele as novas informações que precisam ser atualizadas. Não precisa nem ter o método update, apenas anotar o método put do controller com @Transactional que o update no banco será disparado automaticamente ao final do método, pois você carregou uma entidade JPA do banco de dados e alterou os atributos dela.

Entendi Rodrigo vou tentar aqui fazendo exatamente como esta falando é porque não quiz deixar a resposabilidade de salvar la na Controlle e sim em um Service que fiz aqui para depois ir para repository mas vou tentar aqui te falo muito obrigado.