Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Dúvida com a resposta gerada na serialização

Olá a todos.

desenvolvi uma API que simpesmente recebe uma url via get e devolve o resultado em json, tudo funciona bem, mas por algum motivo que eu não sei identificar, em um controller ele devolve um json como esperado {"chave": valor}, já npo outro controller ele está devolvendo apenas { valor} .Porque isso acontece?, oque posso fazer para que seja sempre retornado um json com chave e valor?

1- serializando com chave e valor:

@Controller
public class ContratoController {

    @Inject
    private ContratoFacade contratoFacade;

    @Inject
    private UnidadeFacade unidadeFacade;

    @Inject
    private EnteFacade enteFacade;

    @Inject
    private Result result;

    @Get("/contratos")
    public void lista(Integer enteId, Integer unidadeId, Integer exercicio) throws SQLException{

        if(enteId==null && unidadeId==null && exercicio==null){
            result.use(Results.http()).setStatusCode(HttpServletResponse.SC_BAD_REQUEST);
            result.use(Results.json()).withoutRoot().from("Informe pelo menos um parâmetro para a consulta.").serialize();
        }
        else if(enteId!=null && enteFacade.buscarEntePorId(enteId)==null){
            result.use(Results.http()).setStatusCode(HttpServletResponse.SC_BAD_REQUEST);
            result.use(Results.json()).withoutRoot().from("Ente inexistente.").serialize();
        }
        else if(unidadeId!=null && unidadeFacade.buscarUnidadePorId(unidadeId)==null){
            result.use(Results.http()).setStatusCode(HttpServletResponse.SC_BAD_REQUEST);
            result.use(Results.json()).withoutRoot().from("Unidade inexistente.").serialize();
        }
        else{
            Collection<ContratoDTO> contratos =  contratoFacade.findContratoExportacao(enteId,unidadeId, exercicio);

            result.use(Results.json()).indented().serializeNulls().withoutRoot().from(contratos).recursive().serialize();
        }

    }
}

Trecho da Resposta:

[
  {
    "contratoId": 60105,
    "dataAssinatura": "2018-01-18T00:00:00-0300",
    "numeroContrato": "04",
    "dataVigenciaInicio": "2018-01-18T00:00:00-0300",
    "dataVigenciaFim": "2019-01-18T00:00:00-0300",
    "dataPublicacaoContrato": null,
    "dataEnvioPublicacao": null,
    "objeto": "APERFEIÇOAMENTO DAS ATIVIDADES DO PROCESSO DE REGULAÇÃO DO ACESSO AOS SERVIÇOS DE SAÚDE DA REDE PÚBLICA",
    "valorContrato": 14205991.08,
    "fornecedor": {
      "fornecedorId": 5788,
      "nome": "EMPRESA MARANHENSE DE SERVIÇOS HOSPITALARES - EMSERH",
      "cpfCnpj": "18519709000163"
    },

2- está serializando apenas o valor:

@Controller
public class ConvenioController {


    @Inject 
    private Result result;

    @Inject
    private ConvenioFacadeBean convenioFacadeBean;

    @Get
    @Path("/convenios")
    public void pesquisarConvenio(Integer enteId, Integer unidadeId, Integer exercicio){

        if(enteId == null && unidadeId == null && exercicio == null){
            result.use(Results.http()).setStatusCode(HttpServletResponse.SC_BAD_REQUEST);
            result.use(Results.json()).withoutRoot().from("Informe pelo menos um parâmetro para a consulta.").serialize();
        }

        Collection<Convenio> convenios = convenioFacadeBean.findConvenioByEnte(enteId, unidadeId, exercicio);

        result.use(Results.json()).indented().serializeNulls().withoutRoot().from(convenios).serialize();

    }



}

Trecho da Resposta:

[
  [
    50,
    2253206,
    4178,
    "000000",
    "05.025.553/0001-12",
    "Sr. Fernando Tadeu Mendonça\r\nLima, portador da C.I. nº 28882194-7-SSP/MA, CPF n° 094.619.813-\r\n68.",
    0,
    "00000",
    0,
    0,
    0,
    "2009-10-20T00:00:00-0300",
    0,
    "000",
    "000",
    "0000                                                                                                ",
    "2009-10-20T00:00:00-0300",
    "J",
    "TERMO DE COOPERAÇÃO\r\nSECRETARIA DE ESTADO DO DESENVOLVIMENTO\r\nAGRÁRIO\r\nEXTRATO DE COOPERAÇÃO TÉCNICA. Extrato de Termo de\r\nCooperação Técnica e Gerencial de entre si celebram de um lado o\r\nEstado do Maranhão, por meio da Secretaria de Estado do Desenvolvimento\r\nAgrário ¿ SEDAGRO, inscrita no CNPJ nº. 10.827.872/0001-\r\n81, OBJETO DO TERMO: Adesão e o compromisso da construção e/\r\nou fortalecimento de parcerias visando a integração, harmonização e\r\notimização dos recursos humanos, materiais e financeiros, por meio da\r\nação conjunta dos acordantes envolvidos nos Programas e Ações de\r\nDesenvolvimento Agrário Sustentável do Estado do Maranhão",
    1,
    2009,
    2009,
    "2011-07-31T00:00:00-0300",
    "2009-11-10T00:00:00-0300",
    "2009-11-10T00:00:00-0300",
    "2009-11-10T00:00:00-0300"
  ],
4 respostas

Oi Ricardo!

Você consegue postar um trecho do seu modelo Contrato e ContratoDTO? Em especial, a parte em que os campos estão declarados

Olá Philippe, consigo sim:


@Entity
@Table(name = "contrato")
public class Contrato implements Serializable {

    private static final long serialVersionUID = 1L;


    private int contratoId;
    private Fornecedor fornecedor;
    private Licitacao licitacao;
    private Date dataAssinatura;
    private Date dataVigenciaInicio;
    private Date dataVigenciaFim;
    private String numeroContrato;
    private String anoContrato;
    private double valorContrato;
    private String objeto;
    private Date dataPublicacaoContrato;
    private String meioPublicacao;
    private Date dataEnvioPublicacao;
//mapeamento feito nos gets
public class ContratoDTO {

    private Integer contratoId;
    private Date dataAssinatura;
    private String numeroContrato;
    private Date dataVigenciaInicio;
    private Date dataVigenciaFim;
    private Date dataPublicacaoContrato;
    private Date dataEnvioPublicacao;
    private String objeto;
    private BigDecimal valorContrato;
    private FornecedorDTO fornecedor;
    private String meioPublicacao;
    private String rescisao;
    private Date dataRescisao;
    private String motivoRescisao;
    private String anoContrato;
    private UnidadeDTO unidade;
    private Integer licitacaoId;
    private Status status;
//gets e sets

}
@Entity
@Table(schema = "scp", name = "convenio")
//@SequenceGenerator(name = "seq_convenio", sequenceName = "scp.seq_convenio")
    public class Convenio implements Serializable {

    private static final long serialVersionUID = -7070206529114701603L;


    @Id
//    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_convenio")
    @Column(name = "convenio_id")
    private Integer convenioId;

    @Column(name = "jurisdicionado_id")
    private Integer unidadeId;

    @Column(name = "responsavel_id")
    private Integer responsavelId;

    @Column(name = "convenente")
    private String convenente;

    @Column(name = "cnpj_convenente")
    private String cnpjConvenente;

    @Column(name = "interveniente")
    private String interveniente;

    @Column(name = "valor_patrimonio")
    private Double valorPatrimonio;

    @Column(name = "fonte_recurso")
    private String fonteRecurso;

    @Column(name = "valor_convenio")
    private Double valorConvenio;

    @Column(name = "valor_concedente")
    private Double valorConcedente;

    @Column(name = "valor_contrapartida")
    private Double valorContrapartida;

    @Column(name = "quantidade_parcela")
    private Integer quantidadeParcela;

    @Column(name = "conta_corrente")
    private String contaCorrente;

    @Column(name = "agencia")
    private String agencia;

    @Column(name = "banco")
    private String banco;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "data_assinatura")
    private Date dataAssinatura;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "data_publicacao")
    private Date dataPublicacao;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "data_vigencia_inicio")
    private Date dataVigenciaInicio;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "data_vigencia_fim")
    private Date dataVigenciaFim;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "data_entrega")
    private Date dataEntrega;

    @Column(name = "natureza_juridica")
    private String naturezaJuridica;

    @Column(name = "objeto")
    private String objeto;

    @Column(name = "numero_convenio")
    private Integer numeroConvenio;

    @Column(name = "ano_convenio")
    private Integer anoConvenio;

    @Column(name = "exercicio")
    private Integer exercicio;
//gets e sets
}

sendo que a lista dos convênios eu puxo de uma nativeQuery da JPA.

hmm...estranho mesmo esse problema, tenta tirar o implements Serializable pra ver se arruma o problema?

solução!

Eu encontrei a razão do problema, entretanto não sei porque ele ocorre

Ambas as queries foram definidas como NativeQueries da JPA

            Collection<ContratoDTO> contratos =  contratoFacade.findContratoExportacao(enteId,unidadeId, exercicio);


        Collection<Convenio> convenios = convenioFacadeBean.findConvenioByEnte(enteId, unidadeId, exercicio);

Na busca de contratos a querie nativa me devolve um array de objetos e para cada um eu crio um ContratoDTO na raça

Querie q = em.createNativeQuerie("select c.id,c.valor,c.objeto from  contrato c");
List<Object[]> objects =  q.getResultList();
for(Object[] o : objects){
ContratoDTO  dto = new ContratoDTO();
dto.setId = o[0];
//.....
}

isso funciona direitinho. Agora na querie de convenios , tento recuperar os convenios diretamente e por algum motivo acho que não estou recebendo uma lista de convênios, mas sim de objetos

Querie q =  em.createNativeQuerie("select c from convenio c");

List<Convenio> convenios = q.getResultList();

return convenios;

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software