Error Syntax! Java + XML

0
  • The database must be implemented in SQLite and should have the tables; tbprevisao e tbcidade
  • The system should keep the data of the cities already consulted in order to avoid having to search the CPTEC service for the city code with each new query of the same city;
  • The system should keep the forecast data already consulted on the forecast and the update date in the field tbcidade.atualizacao. If at the time of the query the forecast update date is different from today, all data should be removed from the forecast and new data should be of CPTEC;
  • The system should have a graphical or command-line interface for the user to provide the name of a city or part of the name. In the sequence the system should show as a result the weather forecast for the next 7 days - formed by date (dd / mm / yyyy), time, IUV, minimum and maximum temperature. In case of the given name result in multiple names, for example São José, the system should display only the first query.
  • Search URL for city with id = 4963 link

    URL to search for city code link

    I tried to create the connection as follows!

    package aula;
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.InputStreamReader;
    import java.io.StringReader;
    import java.net.URL;
    import java.net.URLConnection;
    import java.net.URLEncoder;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.xml.bind.JAXBContext;
    import javax.xml.bind.Unmarshaller;
    
    
    
    public class BancoDados {
    
        public Connection conectar() throws SQLException, ClassNotFoundException {
            Connection conexao = null;
            Class.forName("org.sqlite.JDBC");
            File bd = new File("bdprevisao.db");
            /* verifica se o arquivo do BD existe na raiz do projeto */
            if( !bd.exists() ){
            /* cria o arquivo do BD na raiz do projeto e cria uma conexão para o BD */
            conexao = DriverManager.getConnection("jdbc:sqlite:bdprevisao.db");
            /* como o BD não existe então é necessário criar as tabelas */
            //createTableCidade();
            //createTablePrevisao();
            }
            else{
            /* cria uma conexão com o BD */
            conexao = DriverManager.getConnection("jdbc:sqlite:bdprevisao.db");
            }
            conexao.setAutoCommit(false);
            return conexao;
            }
    
        public boolean createTableCidade(Connection conexao) throws SQLException{
            Statement stmt = conexao.createStatement();
             String sql = "create table if not exists tbcidade( " +
             "id int not null," +
             "nome varchar(64) not null," +
             "uf char(2) not null," +
             "atualizacao varchar(10)" +
             ")";
             stmt.executeUpdate(sql);
             stmt.close();
             return true;
        };
    
        public boolean createTablePrevisao(Connection conexao) throws SQLException{
    
             Statement stmt = conexao.createStatement();
             String sql = "create table if not exists tbprevisao( " +
             "id int not null," +
             "dia date not null," +
             "tempo char(3) not null," +
             "minima float not null," +
             "maxima float not null," +
             "iuv float not null," +
             "primary key (id, dia)," +
             "foreign key (id) references tbcidade(id) " +
             ")";
             stmt.executeUpdate(sql);
             stmt.close();
             return true;
            }
    
    
    
        public boolean insertCidade(Cidade cidade, Connection conexao) throws SQLException{
            // o campo atualizacao irá receber o valor padrão, ou seja, null 
            String sql = "insert or ignore into tbcidade(id,nome,uf) values(?,?,?)";
            PreparedStatement stmt = conexao.prepareStatement(sql);
            stmt.setInt(1, cidade.getId() );
            stmt.setString(2, cidade.getNome() );
            stmt.setString(3, cidade.getUf() );
            stmt.execute();
            stmt.close();
            conexao.commit();
            return true;
            }
    
    
        public List<Cidade> selectCidade(String sql, Connection conexao) throws SQLException{
            Statement stmt = conexao.createStatement();
            ResultSet rs = stmt.executeQuery(sql);
            List<Cidade> lista = new ArrayList<>();
            Cidade cidade;
            while ( rs.next() ) {
            cidade = new Cidade();
            cidade.setId(rs.getInt("id"));
            cidade.setNome(rs.getString("nome"));
            cidade.setUf(rs.getString("uf"));
            cidade.setAtualizacao(rs.getString("atualizacao"));
            }
            rs.close();
            stmt.close();
            conexao.commit();
            return lista;
            }
    
        public String getXMLCidade(String cidade) throws Exception {
            String charset = java.nio.charset.StandardCharsets.ISO_8859_1.name();
            String linha, resultado = "";
            String urlListaCidade = "http://servicos.cptec.inpe.br/XML/listaCidades?city=%s";
    
    
    //codifica os parâmetros
        String parametro = String.format(urlListaCidade, URLEncoder.encode(cidade, charset) );
        URL url = new URL(parametro);
        URLConnection conexao = url.openConnection();
        BufferedReader reader = new BufferedReader(new InputStreamReader(conexao.getInputStream()));
        while((linha = reader.readLine()) != null){
        resultado += linha;
        }
        return resultado;
        }
    
    public Cidade[] xmlToObjectCidade(String xml) throws Exception {
         StringReader sr = new StringReader(xml);
         /* a base do XML é uma marcação de nome cidades */
         JAXBContext context = JAXBContext.newInstance(Cidades.class);
         Unmarshaller un = context.createUnmarshaller();
         Cidades cidades = (Cidades) un.unmarshal(sr);
         return cidades.getCidade();
        }
    

    }

    Class city

    package aula;
    
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlRootElement;
    import javax.xml.bind.annotation.XmlType;
    @XmlRootElement(name = "cidade")
    @XmlType(propOrder = {"nome", "uf", "id"})
    public class Cidade {
     @XmlElement(name = "id")
     private Integer id;
     @XmlElement(name = "nome")
     private String nome;
     @XmlElement(name = "uf")
     private String uf;
    private String atualicao;
    
    public void setId(int int1) {
        // TODO Auto-generated method stub
        this.id = int1;
    }
    
    public void setAtualizacao(String string) {
        // TODO Auto-generated method stub
        this.atualicao =  string;
    }
    
    public void setUf(String string) {
        // TODO Auto-generated method stub
        this.uf =  string;
    }
    
    public void setNome(String string) {
        // TODO Auto-generated method stub
        this.nome =  string;
    }
    
    public Integer getId() {
        return id;
    }
    
    public String getNome() {
        return nome;
    }
    
    public String getUf() {
        return uf;
    }
    
    public String getAtualicao() {
        return atualicao;
    }
    
    public void setId(Integer id) {
        this.id = id;
    }
    
    public void setAtualicao(String atualicao) {
        this.atualicao = atualicao;
    }
    
    
    }
    

    Class cities

    package aula;
    
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlRootElement;
    import javax.xml.bind.annotation.XmlType;
    
    @XmlRootElement(name = "cidades")
    @XmlType(propOrder = {"cidade"})
    
    public class Cidades {
     @XmlElement
     private Cidade[] cidade;
    
    public Cidade[] getCidade() {
        // TODO Auto-generated method stub
        return null;
    }
    }
    

    You are experiencing the following error

    com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 7 counts of IllegalAnnotationExceptions
    A propriedade atualicao está presente, mas não foi especificada em @XmlType.propOrder
        this problem is related to the following location:
            at public java.lang.String aula.Cidade.getAtualicao()
            at aula.Cidade
            at private aula.Cidade[] aula.Cidades.cidade
            at aula.Cidades
    Há duas propriedades com o nome "id"
        this problem is related to the following location:
            at public java.lang.Integer aula.Cidade.getId()
            at aula.Cidade
            at private aula.Cidade[] aula.Cidades.cidade
            at aula.Cidades
        this problem is related to the following location:
            at private java.lang.Integer aula.Cidade.id
            at aula.Cidade
            at private aula.Cidade[] aula.Cidades.cidade
            at aula.Cidades
    Há duas propriedades com o nome "nome"
        this problem is related to the following location:
            at public java.lang.String aula.Cidade.getNome()
            at aula.Cidade
            at private aula.Cidade[] aula.Cidades.cidade
            at aula.Cidades
        this problem is related to the following location:
            at private java.lang.String aula.Cidade.nome
            at aula.Cidade
            at private aula.Cidade[] aula.Cidades.cidade
            at aula.Cidades
    Há duas propriedades com o nome "uf"
        this problem is related to the following location:
            at public java.lang.String aula.Cidade.getUf()
            at aula.Cidade
            at private aula.Cidade[] aula.Cidades.cidade
            at aula.Cidades
        this problem is related to the following location:
            at private java.lang.String aula.Cidade.uf
            at aula.Cidade
            at private aula.Cidade[] aula.Cidades.cidade
            at aula.Cidades
    A classe tem duas propriedades do mesmo nome "nome"
        this problem is related to the following location:
            at public java.lang.String aula.Cidade.getNome()
            at aula.Cidade
            at private aula.Cidade[] aula.Cidades.cidade
            at aula.Cidades
        this problem is related to the following location:
            at private java.lang.String aula.Cidade.nome
            at aula.Cidade
            at private aula.Cidade[] aula.Cidades.cidade
            at aula.Cidades
    A classe tem duas propriedades do mesmo nome "uf"
        this problem is related to the following location:
            at public java.lang.String aula.Cidade.getUf()
            at aula.Cidade
            at private aula.Cidade[] aula.Cidades.cidade
            at aula.Cidades
        this problem is related to the following location:
            at private java.lang.String aula.Cidade.uf
            at aula.Cidade
            at private aula.Cidade[] aula.Cidades.cidade
            at aula.Cidades
    A classe tem duas propriedades do mesmo nome "id"
        this problem is related to the following location:
            at public java.lang.Integer aula.Cidade.getId()
            at aula.Cidade
            at private aula.Cidade[] aula.Cidades.cidade
            at aula.Cidades
        this problem is related to the following location:
            at private java.lang.Integer aula.Cidade.id
            at aula.Cidade
            at private aula.Cidade[] aula.Cidades.cidade
            at aula.Cidades
    
        at com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException$Builder.check(Unknown Source)
        at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(Unknown Source)
        at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(Unknown Source)
        at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(Unknown Source)
        at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(Unknown Source)
        at com.sun.xml.internal.bind.v2.ContextFactory.createContext(Unknown Source)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at javax.xml.bind.ContextFinder.newInstance(Unknown Source)
        at javax.xml.bind.ContextFinder.newInstance(Unknown Source)
        at javax.xml.bind.ContextFinder.find(Unknown Source)
        at javax.xml.bind.JAXBContext.newInstance(Unknown Source)
        at javax.xml.bind.JAXBContext.newInstance(Unknown Source)
        at aula.BancoDados.xmlToObjectCidade(BancoDados.java:128)
        at aula.Main.main(Main.java:26)
    

    My main file if you need it!

    BancoDados banco = new BancoDados();
    
            try {
                Connection conexao = banco.conectar();
                banco.createTableCidade(conexao);
                banco.createTablePrevisao(conexao);
    
                //List<Cidade> teste = banco.selectCidade(sql, conexao);
    
                try {
                    String testando = banco.getXMLCidade("sao jose");
    
                    System.out.println(testando);
    
                    banco.xmlToObjectCidade(banco.getXMLCidade("sao jose"));
    
    
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
    
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
        
    asked by anonymous 23.11.2017 / 17:23

    1 answer

    0

    propOrder is based on the attribute / property field you declare. I recommend you explicitly indicate whether you want to use the attribute name or the field name.

    If it is in your interest to use the field name, add the annotation: @XmlAccessorType(XmlAccessType.FIELD) in your class.

    References:

    link link

        
    24.04.2018 / 17:37