Problema ao ler tag de um arquivo xml com XStream

9 respostas
Viniciustelles

Boa tarde pessoal, estou conseguindo ler todo meu arquivo xml, quando percebi que faltava capturar estes elementos desta tag, utilizei uma função do Xstream e foi fácil, só que o problema é que quando utilizo está função ele não deixa buscar os outros elementos das outras tags da uma java.lang.NullPointerException

:S alguém já teve este problema?

9 Respostas

nel

A exceção é bem básica. Trata-se de uma referência nula que tenta executar uma ação .
Verifique na API se ela não oferece forma de verificar se um determinado atributo existe na tag em questão.
Ou se simplesmente tu passar para a API um atributo inexistente na tag, ela gere essa exceção.

Enfim, leia a API que está utilizando e qualquer coisa, posta o código e indique a linha onde o erro é gerado.

Viniciustelles

vou postar meu código para melhor entendimento,

esta é minha classe que pega os elementos das tags beneficiario

public class ConversorBeneficiario implements Converter {

    @Override
    public void marshal(Object valor, HierarchicalStreamWriter escreve, MarshallingContext texto) {
        Beneficiario beneficiario = (Beneficiario) valor;
        escreve.addAttribute("cco", beneficiario.getCco());
        escreve.addAttribute("situacao", beneficiario.getSituacao());
        escreve.addAttribute("dataAtualizacao", beneficiario.getDataAtualizacao());


    }

    @Override
    public Object unmarshal(HierarchicalStreamReader ler, UnmarshallingContext texto) {
        Beneficiario beneficiario = new Beneficiario();
        beneficiario.setCco(ler.getAttribute("cco"));
        beneficiario.setSituacao(ler.getAttribute("situacao"));
        beneficiario.setDataAtualizacao(ler.getAttribute("dataAtualizacao"));
        return beneficiario;
    }

    @Override
    public boolean canConvert(Class clazz) {
        return clazz.equals(Beneficiario.class);
    }
}

esta é a classe que pega o valor dos objetos

public class LerXml implements Runnable {

    @Override
    public void run() {
        try {
            XStream xstream = new XStream(new Dom4JDriver());
            xstream.processAnnotations(MensagemSIB.class);
            xstream.registerConverter(new ConversorBeneficiario());
            xstream.alias("conferencia", List.class);
            xstream.alias("beneficiario", Beneficiario.class);

            BufferedReader input = new BufferedReader(new FileReader("c:\\fileTeste.xml"));
            MensagemSIB bl = (MensagemSIB) xstream.fromXML(input);

            List<Beneficiario> beneficiarios = bl.getMensagem().getAnsParaOperadora().getConferencia().getBeneficiarios();
            long id = 1;
            for (Beneficiario b : beneficiarios) {
                System.out.println("-----------------------------------------------------------------------------------");
                System.out.println("Numero de registros         :   " + id++);
                System.out.println("CCO                         :   " + b.getCco());
                System.out.println("Situacao                    :   " + b.getSituacao());
                System.out.println("Data atualização            :   " + b.getDataAtualizacao());
                System.out.println("Nome                        :   " + b.getIdentificacao().getNome());
                System.out.println("Sexo                        :   " + b.getIdentificacao().getSexo());
                System.out.println("Cpf                         :   " + b.getIdentificacao().getCpf());
                System.out.println("Nome da mae                 :   " + b.getIdentificacao().getNomeMae());
                System.out.println("Data de Nascimento          :   " + b.getIdentificacao().getDataNascimento());
                System.out.println("Rua                         :   " + b.getEndereco().getLogradouro());
                System.out.println("Numero                      :   " + b.getEndereco().getNumero());
                System.out.println("Bairro                      :   " + b.getEndereco().getBairro());
                System.out.println("Codigo municipio            :   " + b.getEndereco().getCodigoMunicipio());
                System.out.println("Cep                         :   " + b.getEndereco().getCep());
                System.out.println("Tipo endereco               :   " + b.getEndereco().getTipoEndereco());
                System.out.println("Reside no exterior          :   " + b.getEndereco().getResideExterior());
                System.out.println("Complemento                 :   " + b.getEndereco().getComplemento());
                System.out.println("Codigo municipio residencia :   " + b.getEndereco().getCodigoMunicipioResidencia());
                System.out.println("Relacao dependencia         :   " + b.getVinculo().getRelacaoDependencia());
                System.out.println("CCO Beneficiario titular    :   " + b.getVinculo().getCcoBeneficiarioTitular());
                System.out.println("Data contratacao            :   " + b.getVinculo().getDataContratacao());
                System.out.println("Numero plano ANS            :   " + b.getVinculo().getNumeroPlanoANS() );
                System.out.println("Cobertura parcial temporaria:   " + b.getVinculo().getCoberturaParcialTemporaria());
                System.out.println("Itens excluidos cobertura   :   " + b.getVinculo().getItensExcluidosCobertura() );
                System.out.println("Cnpj empresa contratante    :   " + b.getVinculo().getCnpjEmpresaContratante());
                System.out.println("Data cancelamento           :   " + b.getVinculo().getDataCancelamento());
                System.out.println("Data reativacao             :   " + b.getVinculo().getDataReativacao() );
                System.out.println("Numero plano operadora      :   " + b.getVinculo().getNumeroPlanoOperadora() );
            }


            input.close();
        } catch (IOException e) {
        }
    }
}

quando executo tudo isso junto tenho o seguinte resultado no console

run:
Exception in thread "Thread-0" java.lang.NullPointerException
--------------------------------------------------------
Numero de registros         :   1
CCO                         :   026997828105
Situacao                    :   ATIVO
Data atualização            :   2011-09-05
	at br.com.businessflex.controller.LerXML.run(LerXML.java:37)
	at java.lang.Thread.run(Thread.java:722)
CONSTRUÍDO COM SUCESSO (tempo total: 16 minutos 7 segundos)

Se mando rodar o mesmo código apenas tirando a classe ConversorBeneficiario ele lê todo o arquivo setando os valores de CCO, Situação e Data atualização para null.

nel

No seu código postado, qual linha está acusando exceção ?

Viniciustelles

Logo na primeira linha após a data de atualização quando ele começa a pegar os dados da Classe Identificacao que contém nome… etc…

nel

Então está tendo problema na conversão do seu XML. Verifica o método que gera o seu XML, é lá que deve estar o problema.
Uma curiosidade, tais mexendo com PTU (Protocolo de Transmissão UNIMED) ?

Abraços.

Viniciustelles

É um arquivo ANS ( agência nacional de saúde), não sou eu que gero nel pego ele pronto, o trabalho é ler e gravar no banco de dados… :S e agora oque poderia fazer?? :roll:

nel
Viniciustelles:
É um arquivo ANS ( agência nacional de saúde), não sou eu que gero nel pego ele pronto, o trabalho é ler e gravar no banco de dados... :S e agora oque poderia fazer?? :roll:

Sim, é que o PTU usa o padrão ANS...trabalhei com ele no ano passado. Bom, a ANS disponibiliza um XSD, tu poderia usar JAXB para gerar um objeto pronto.
Basta passar o XSD, o XML e ele gera o objeto, inclusive, valida ele.

Mas o teu erro não é esse. O que tu precisa analisar é se a tag Identificacao realmente existe no XML que tu está lendo. Se ela não existir, bom, é óbvio que vai gerar NullPointer. Na época, eu tive que fazer tratamentos do tipo:

if(null != getIdentificacao()) {

}

Porque o schema da ANS indicava que essa tag XML não é obrigatória.
Resumindo, tu precisa conhecer o schema da ANS para identificar quais tags não são obrigatória e fazer os devidos "if´s" no seu código.
Senão, vai ter que entupir de if´s e com certeza terão alguns desnecessários.

Viniciustelles

Certo obrigado pela dica vou testar com JAXB se é mais simples :smiley:

nel

Isso é opinião minha. A questão é que tu precisa verificar se um objeto não é nulo, caso ele represente uma tag que não é obrigatória.

Criado 26 de julho de 2012
Ultima resposta 26 de jul. de 2012
Respostas 9
Participantes 2