Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Personalizar desserialização do jaxb

Saudações irmãos de código.

estou aqui estudando mongodb + java e resolvi fazer uma api restfull pra brincar um pouco, ao desserializar o objeto Cliente o atributo id, que é o atributo referente ao campo “_id” da collection no mongodbd, o mesmo vem no seguinte formato:

“id”: {
“timestamp”: 1537705891,
“machineIdentifier”: 13207740,
“processIdentifier”: -17673,
“counter”: 3768415,
“time”: 1537705891000,
“date”: 1537705891000,
“timeSecond”: 1537705891
}

a classe cliente se encontra da seguinte forma:

import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlValue;

import org.bson.types.ObjectId;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Cliente{

private ObjectId id;
private String nome;
private String cpf;
private String rg;

//metodos…

}

porem no lugar de exibir esse atributo desta forma eu gostaria de exibir o método “toString” dese atributo, gostaria de exibir o atributo id da seguinte forma:

“id” : “5ba7fd625786543ee8260ce2”

// ou como é no mongodb

“id” : “ObjectId('5ba7fd625786543ee8260ce2')”

alguém sabe como posso fazer isso?

Obrigado a todos

4 respostas
solução

Você pode implementar um XMLAdapter e lá diz como é esse seu "toString".E depois anotar esse atribuito com essa anotação:

https://docs.oracle.com/javase/7/docs/api/javax/xml/bind/annotation/adapters/XmlJavaTypeAdapter.html

ObjectId é uma classe do pacote "org.bson.types.ObjectId"

então eu teria que criar um classe que herde todo o comportamento do " ObjectId " e anotar ela com o XMLAdapter e dps mudar meu atributo da minha classe "Cliente" para essa nova classe, é isso?

estava tentando fazer essa solução e me deparei com um problema, a classe "ObjectId" é final, ou senha não pode ter herdeiros......

peço desculpas, eu havia entendido errado o que vc tinha falado.

bom o XMLAdapter na verdade é uma classe não ima interface. vou colocar aqui a solução, funcionou perfeitamente.

até pq alguém pode precisar dessa informação um dia.

Adapter:

import javax.xml.bind.annotation.adapters.XmlAdapter;

import org.bson.types.ObjectId;

public class ObjectIdAdapter extends XmlAdapter<String, ObjectId>{


    @Override
    public String marshal(ObjectId objectId) throws Exception {
        return objectId.toHexString();
    }

    @Override
    public ObjectId unmarshal(String id) throws Exception {
        return new ObjectId(id);
    }

}

Pojo:

import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlValue;

import org.bson.types.ObjectId;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Cliente{

@XmlJavaTypeAdapter(ObjectIdAdapter.class)
private ObjectId id;
private String nome;
private String cpf;
private String rg;

//metodos…

}

resultado:

{
    "id": "5bac3f5878436d04f0d7dbbf",
    "nome": "Aala",
    "cpf" : "xxx.xxx.xxx-xx",
    "rg" :  "xx.xxx.xxx-x"
}