1
resposta

Problema ao salvar uma lista de String - JAVA

Pessoal boa tarde, Estou com um problema aqui onde eu tenho no banco PostgreSQL um campo do tipo "_text", acontece que lá eu posso gravar uma lista de string como por exemplo : {url1,url2,url3}.

O meu problema é na hora de usar o enpoint PATCH, quando eu quero atualizar esse campo, ele carrega esse atributo dentro do objeto e realiza o save. mas no banco de dados fica null.

Como é um código interno eu não posso mostrar mas vou fazer um exemplo aqui de como está hoje:

banco de dados: id: 1

nome: fabio

endereco: "{rua1},{rua2}"

agora estou fazendo o patch passando só o endereço: body:

{
     "endereco": ["url1,url2,url3,url4,url5"]
}

PessoaService

public void updatePatch(PessoaSaveDto dto, Long id) {
        Pessoa pessoa = getById(id); //buscando por pessoa
        boolean needUpdate = false;
        Pessoa mapper = saveMapper.toEntity(dto);
        ...
        ...

        if (Objects.nonNull(mapper.getEndereco())) {
            pessoa.setEndereco(dto.getEndereco());
            needUpdate = true;
        }

        pessoa.setLastUpdate(LocalDateTime.now(ZoneOffset.UTC));
        if (needUpdate) repositoryWrite.save(pessoa);
}

Acontece que quando ele faz a ação save, inspecionando ele vejo que dentro do objeto está carregando o atributo endereco atualizado, depois quando termina a ação e vejo no banco ele está nulo.

Lembrando que passando um novo endereço ou não, na hora de salvar ele fica nulo, ou seja, se eu quiser fazer um patch do nome para "fabio barros dos santos", ele atualiza essa informação e a coluna endereco ao invés de ficar intacta, muda para null fazendo com que perca esse dado.

O tipo do atributo endereço é:

private String[] endereco;

1 resposta

Olá Fabio, tudo bem?

Pelo que entendi, você está tendo problemas ao salvar uma lista de string em um campo do tipo "_text" no banco de dados PostgreSQL, certo? E isso está acontecendo quando você usa o endpoint PATCH para atualizar esse campo, correto?

Bom, pelo código que você compartilhou, parece que o problema pode estar na linha "pessoa.setEndereco(dto.getEndereco());", onde você está setando o valor do novo endereço no objeto "pessoa". Talvez seja necessário converter o array de string em uma string única antes de salvar no banco de dados.

Uma possível solução seria utilizar o método "String.join()" para concatenar as strings do array em uma única string, separando-as por vírgula (",") ou outro separador de sua escolha. Por exemplo:

if (Objects.nonNull(mapper.getEndereco())) {
    String endereco = String.join(",", dto.getEndereco());
    pessoa.setEndereco(endereco);
    needUpdate = true;
}

Dessa forma, o array de string será convertido em uma única string separada por vírgulas e poderá ser salvo corretamente no banco de dados.

Espero ter ajudado e bons estudos!