[RESOLVIDO] Personalizar serialização de atributo JAXB

8 respostas Resolvido
java
A

boa noite caros amigos de código.

Estou estudando mongodb com java e resolvi junto fazer uma serialização automática com jaxb e surgiu um dilema que nuca precisei fazer antes e gostaria de saber se algum de vcs saberia me ajudar.

criei um atributo id que fica o “_id” das collections do mongodb, quem ja usou mongodb com java sabe que tem uma classe especifica para ele, essa serialização eu uso quando vou responder um ws em json e gostaria de personalizar esse atributo para exibir o toString desse objeto, pois atualmente ele retorna isso no ws(para o atributo id)

"id": {
        "timestamp": [telefone removido],
        "machineIdentifier": 452672,
        "processIdentifier": -19764,
        "counter": 8957248,
        "time": 1537680278000,
        "date": 1537680278000,
        "timeSecond": [telefone removido]
    }

ta meio estranho, sem contar que quando vamos fazer um “find()” na collection do mongodb, usamos o toString desse objeto.

alguém poderia me ajudar???

8 Respostas

D

Mas você está lendo o JSON do MongoDB e já serializando em XML?

A

estou serializando em json com jaxb

D

Alguma razão específica para usar algo tão complexo? Não é mais fácil usar algo como o Gson ou Jackson mesmo?

A

bom, estou fazendo pra estudar, queria que quem consumisse a api possa ter a resposta em json o xml se ela preferir

D

Suponho que esteja implementando RESTful, certo?
Se é isso, você define qual o tipo de retorno no controller.

A

exatamente isso, porem eu quero personalizad o id, para que retorne no json ou xml o metodo “toString” no lugar de colocar toda a estrutura do atributo “id”.

o atributo “id” no caso é do tipo “ObjectId”, objeto compativel com o campo “_id” das collections do mongodb.

quero que no json envie o toString

A

o retorno eu defini como json e xml, o que eu quero é personalizar a saida de um atributo na saida o ws

A
Solucao aceita

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

}
Criado 26 de setembro de 2018
Ultima resposta 29 de set. de 2018
Respostas 8
Participantes 2