Erro em Properties

15 respostas
tRuNkSnEt

Metodo:

public String getSQL(String funcao) throws FileNotFoundException, IOException {
	FileInputStream fis = null;
	File arquivo = new File ("sql.properties");
	Properties queries = new Properties();
	try {
	                fis = new FileInputStream(arquivo);
		queries.load(fis);
		fis.close();
		sql = queries.getProperty(funcao);
		return sql;
		}
		catch (IOException e) {
			System.out.println(e.getMessage());
			return sql="Erro ao ler o arquivo";
			}
	}

Arquivo sql.properties :

#Teste
#Criado em Abril
getSUsuario=Select * from tb_login where usuario = ?

Debugando…
index.jsp

out.println(getSQL("getSUsuario");

Resultado:
Erro ao ler o arquivo;

O que tem de errado?

15 Respostas

Rafael_Steil

“Erro ao ler arquivo” nao diz nada.

Mas como vc postou no forum web, entao o problema esta nessa linha:

File arquivo = new File ("sql.properties")

Voce nao tem como assumir que o sql.properties vai ser carregando usando como diretorio base o diretorio da tua aplicacao. Use portanto

this.getClass().getResourceAsStream("/sql.propertes")

e coloque o sql.properites em WEB-INF/classes

Rafael

_fs

Rafael, mas fazendo getClass().getResouceAsStream() não vai partir do diretório onde o .class se localiza?

Rafael_Steil

Ele procura no classpath.

Rafael

_fs

Saquei, valeu :smiley:

Luiz_Henrique_Coura

A forma como vc está pegando os dados de seu properties não está muito legal, vendo q vc está abrindo seu arquivo toda vez q vc quer ler uma SQL nova.

tRuNkSnEt:
Metodo:

public String getSQL(String funcao) throws FileNotFoundException, IOException {
	FileInputStream fis = null;
	File arquivo = new File ("sql.properties");
	Properties queries = new Properties();
	try {
	                fis = new FileInputStream(arquivo);
		queries.load(fis);
		fis.close();
		sql = queries.getProperty(funcao);
		return sql;
		}
		catch (IOException e) {
			System.out.println(e.getMessage());
			return sql="Erro ao ler o arquivo";
			}
	}


Uma dica seria vc ler esse artigo (Retirando a SQL do seu código java) aqui do guj onde é usado o padrão singleton para manipular esse .properties.

É bem prático e fácil de entender. :wink:

tRuNkSnEt

Corrigindo …

java.io.FileNotFoundException: \sql.properties (O sistema não pode encontrar o arquivo especificado)

Realmente o erro estava na localização do arquivo. Mas eu estava com a mesma duvida do LIPE ai fui procurar no livro ele realmente dissse que ele procura no classpath.

Ahram percebi os erros lendo o tutorial, mas chega em uma hora que ele diz assim …
Você não precisa saber o que é um Singleton. É basicamente uma solução para você não fazer uma classe que tenha tudo static, desta maneira, você perderia a orientação a objetos.

Ta mas eu quero saber o que é singleton, entao, o que é singleton??

_fs

É uma pattern que garante que apenas uma instância (ou x instancias) de um objeto existe para a aplicação inteira.

Mas é altamente não recomendado para coisas além de um arquivo .properties. Nesse caso é interessante usar, pois se existirem mais instâncias não será um problema. Mas se sua aplicação depende disso, melhor procurar outras soluções.

Rafael_Steil

Eh um Pattern (ou anti-pattern, dependendo de quem analisar) que voce geralmente usa quando quer permitir / ter uma unica instancia da classe. Veja mais em http://c2.com/cgi/wiki?SingletonPattern, ou mesmo buscando por “singleton” no forum.

Rafael

Luiz_Henrique_Coura

O padrão singleton te assegura que irá existir somente uma única instância de determinada classe. Por exemplo:

Queries.java
public class Queries {
    private static Queries queries;
    private Properties myQueries;
    
    //detalhe: o construtor default deve ser privado, assim vc assegura q ninguém vai instanciar sua classe com new Queries()
    private Queries() {
        try {
            FileInputStream fis = new FileInputStream( new File("sql.properties") );
            myQueries = new Properties();

            //aqui eu carrego meu arquivo em meu Properties
            myQueries.load(fis);
            fis.close();
        } catch( Exception e ) {
            e.printStackTrace();
        }
    }

    //aqui vc pega a instância "única" de sua classe. Todos q entrarem aqui irão pegar a referência a instância static queries.
    public static Queries getInstance() {
        if( queries = null ) {
            queries = new Queries();
        }
        return queries;
    }

    //esse método eu copiei do artigo q te passei. Repare q ele recebe a string e pega no Properties já setado.
    public PreparedStatement getPreparedStatement(Connection conn, String queryName) throws SQLException {
        String query = this.queries.getProperty(queryname);
        return conn.prepareStatement(query);
    }
Aqui vc faz sua chamada a essa classe.
...
Queries queries = Queries.getInstance();
...
PreparedStatement ps = queries.getPreparedStatement( connection, sql );
...

Bom, a idéia é essa. Leia esse artigo sobre patterns (Implementando Design Patterns com Java), tb aqui do guj.

falows!

Luiz_Henrique_Coura

Faltou arrumar uns detalhes!

.
.
.
if( queries == null ) {
   queries = new Queries();
}
.
.
.

//esse método eu copiei do artigo q te passei. Repare q ele recebe a string e pega no Properties já setado.
     public PreparedStatement getPreparedStatement(Connection conn, String queryName) throws SQLException {
         String query = this.myQueries.getProperty(queryname);
         return conn.prepareStatement(query);
     }
tRuNkSnEt

Sim Luiz Henrique fiz seguindo os ideiais do o tutorial, ja esta no padrao singleton, so que ainda nao fucniona, estou com problemas ao dar o load no arquivo … ele nao esta achando.
java.io.FileNotFoundException: \br\com\projeto\sql.properties (O sistema não pode encontrar o arquivo especificado)

“Rafael Steil”:

this.getClass().getResouceAsStream("/br/com/projeto/sql.properties");

Então tentei usar isso …Nao perguntei antes porque eu quiz pesquisar sobre mas nao achei muita indicação sobre esse comando. Sei que ele retorna um InputStream mas como eu uso isso dentro de FileInputStream, da tipos incompativeis.

query.load(new FileInputStream(file));

O que eu preciso não é de um File??

renatosilva

Você está numa aplicação web, não é? Será que não deveria fazer isso:

InputStream stream = getServletContext().getResourceAsStream("/WEB-INF/classes/br/com/projeto/sql.properties");

???

Rafael_Steil

tRuNkSnEt:

OPA OPA… eu nao disse o que vc colocou no quote :wink:

O que eu disse foi

this.getClass().getResourceAsStream("/sql.properties");

Note que voce tem que colocar na raiz do WEB-INF/clases, e nao no diretorio do .class

Rafael

Luiz_Henrique_Coura

e ae tRuNkSnEt, funcionou?

tRuNkSnEt

Sim perfeitamente, o que estava faltando era mais conhecimento … peguei alguns tutoriais de manipulação de arquivo, mas uns treco de singleton, mas algumas coisas adicionais e ficou 10 :). Já apliquei os conhecimentos no meu projeto de iniciação cientifica e por agora estou estudando novas tecnologias como JSF + Hibernate, o que vai melhorar ainda mais a aplicação uma vez que estamos dando enfase no modelo MVC.

Como esse anos estamos aprendendo IA + Sistemas multiagentes logo estaria postando minhas “infinitas” duvidas sobre JADE aqui no forum! UhAUhAUH

Criado 25 de abril de 2005
Ultima resposta 27 de abr. de 2005
Respostas 15
Participantes 5