[RESOLVIDO] ResourceBundle

19 respostas
R

Olá amigos :roll:

Tenho meu projeto na seguinte pasta por ex:

c:\renata\projeto1

Meus arquivos de intl (.properties) para esse projeto estão no caminho:

c:\renata\projeto1\pasta1

Entao, dentro do programa, pra criar ResourceBundle eu faço:

ResourceBundle resource = ResourceBundle.getBundle("pasta1/frametags",meuLocale);

Agora meu problema é que meus arquivos .properties de intl não poderão mais ficar no caminho em que está. Eles ficarão em:

c:\renata

Eu simplesmente não consigo mais criar o ResourceBoundle com esse novo caminho!
Já tentei:

ResourceBundle resource  = ResourceBundle.getBundle("../frametags",meuLocale);

Mas ele sempre dá erro:

Exception in thread "main" java.util.MissingResourceException: Can't find bundle for base name ../frametags, locale pt_BR

Fiz diversos testes, percebi que se eu quiser colocar os arquivos .properties de intl em qq diretório com nível abaixo do diretório que se encontra o projeto (c:\renata\projeto1) ele funciona. Mas não consigo indicar pra ele um diretóio que esteja com nível acima do diretório do projeto. É isso mesmo? O que eu faço agora?!?!?! Preciso muito disso!

Agradeço qq. dica!

[]'s - Renata

19 Respostas

A

Acho que é o seguinte: deixando os seus properties fora do projeto, eles não serão carregados pelo classloader. Talvez escrever um classloader que os carregue resolva o seu problema…

R

Amigo, vc poderia me dar alguma pista de como fazer isso?

Eu não tenho a menor idéia! :oops:

A

Eu nunca precisei escrever um classloader customizado. Acredito ser uma tarefa de média complexidade (média pra baixa). Procure no google por “writting custom classloaders” ou coisas do tipo…
Porém, antes, leia alguma coisa a respeito de classloader pra verificar se a minha suspeita está correta :wink:

F

ResourceBundle bundle = ResourceBundle.getBundle(“frametags”);

tente isso pois me parece q esta direto no classpath sem necessidade de passar um caminho “/…”.

espero q ajude

Att

A

É… vendo o post do foliveira81 lembrei de dizer se você não quiser escrever um classloader customizado, basta colocar os arquivos properties no classpath. Também funciona e é mais simples… :slight_smile:

F

Olá Renata,

Eu trabalho da seguinte forma, eu crio pacotes
ex. br.eti.furutani.resources
e coloco os .properties lá dentro
Para recupera-los na minha aplicação eu faço assim:

ResourceBundle resource  = ResourceBundle.getBundle("br.eti.furutani.resources.Mensagens",meuLocale);
R

ERRO

R

Olá amigos!

Obrigada pelas respostas, mas acho que vcs não entenderam meu real problema. Eu sei como faço pra chamar o arquivo .properties, etc, etc, que foi explicado. Mas meu problema é outro! Meu problema é que preciso que os arquivos .properties fiquem num diretório externo ao do projeto, um diretório nada haver com o do projeto.

Por ex, eu posso ter projetos nas seguintes pastas:

c:\renata\projeto1
c:\renata\projeto2
c:\renata\projeto3

Só que eu quero que meu .proporties fique numa pasta assim por ex:

c:\properties\intl

Entenderam? É uma pasta externa ao projeto. Preciso disso pq preciso que vários projetos compartilhem alguns properties, usem os mesmos properties.

Ai que está meu problema, como faço referência a essa pasta externa ao projeto?!

ResourceBundle resource = ResourceBundle.getBundle(CAMINHO,meuLocale);

O que eu coloco no lugar da variável CAMINHO pra funcionar?! Já tentei de tudo… :cry:

Agradeço qq ajuda! :roll:

F

Olá

Por que você não usa PropertyResouceBundle?
Ele tem um construtor que aceita inputstream.

R

Olá!

Eu vi na API sobre esse PropertyResourceBundle. Tentei usar mas não consegui, alguma idéia de como faço isso? Eu criei o InputStream pra ele, mas depois tudo que tentei só deu erro… :cry:

F

Olá

RenataFA:
Olá!
Eu vi na API sobre esse PropertyResourceBundle. Tentei usar mas não consegui, alguma idéia de como faço isso? Eu criei o InputStream pra ele, mas depois tudo que tentei só deu erro… :cry:

Qual erro?

F

Olá

Veja esse post http://www.guj.com.br/posts/list/15/60782.java#319342.

R

Oi!

Eu vi o post sugerido, mas veja continuo com o mesmo problema. Se vc prestar atenção no post, o colega adriano.ferranti resolveu o problema dizendo o seguinte:

Acho que é mais simples você tentar:

PropertyResourceBundle bundle = null; bundle = (PropertyResourceBundle) PropertyResourceBundle.getBundle("file_name"); System.out.println(bundle.getString("property_name"));

onde file_name deve ser o nome do pacote onde está o arquivo mais o nome do arquivo sem a extensão.
Ex.: meupacote.meu_arquivo
para o arquivo meu_arquivo.properties dentro do package meupacote

e property_name, óbvio é o nome da propriedade que você quer ler.

Perceba a seguinte linha que ele disse:

“onde file_name deve ser o nome do pacote onde está o arquivo mais o nome do arquivo sem a extensão.”

Pacote? Ai que está o meu problema! Mesmo problema que eu tenho usando ResourceBundle! Eu não tenho pacote onde está o arquivo, ele está num diretório externo ao projeto. Como dizer isso pra ele?

Eu até que tentei assim como sugerido:

PropertyResourceBundle bundle = (PropertyResourceBundle)PropertyResourceBundle.getBundle("e:/arquivo");
Mas continuo com o msm erro:

[color=red]java.util.MissingResourceException: Can’t find bundle for base name e:/arquivo, locale pt_BR[/color]

Parece q denovo não deu… :cry:

Tô tentando tb a idéia do outro colega, de fazer um ClassLoader. Mas até agora sem sucesso, só erro!

Alguém tem outra dica?! :idea:

A

Eu entendi, Renata. Continuo com as mesmas sugestões:

  1. Escrever um classloader customizado para ler os properties no diretório que você quiser

ou (bem mais simples na minha opinião)

  1. Colocar o diretório com os properties no classpath.
F

Olá

No E: tem um arquivo chamado arquivo_pt_BR.properties?

R

Brigada pela ajuda!

Eu acabei resolvendo de outra forma, sem usar o 1) ou o 2)…
Mas olha, ter pesquisado e lido bastante sobre isso me deu uma idéia aqui de como resolver, e acabou dando certo.

Eu não uso mais ResourceBundle, cheguei a conclusão de que ResourceBundle nada mais é do que um “gerenciamento” de vários properties. Por ex:

frametags.properties
frametags_pt_BR.properties

Então eu criei o meu ResourceBundle. Eu faço dentro dele esse gerenciamento, verifico através do Locale qual a linguagem e o país desejado. Vejo se existe o properties correspondente, se não houver eu chamo o default e pronto! Abro os properties com PropertiesManager a partir do caminho de arquivos que eu quiser.

Depois sobreescrevi o .getString(String tag) do ResourceBundle pra que pegasse o tag correspondente de dentro do meu PropertiesManager, usando um .getProperties(String tag).

Na verdade eu fiz na mão o que eu li na API que o ResourceBundle fazia, o que o ClassLoader fazia e o que o PropertyResourceBundle fazia. Tive que fazer na mão pq todos só aceitam caminhos no formato de packages.

Ficou jóia! :lol:

Agradeço à todos que gastaram um tempinho comigo!

Brigada msm!!! :wink:

H

Tem como vc postar sua solução?

F

Pessoal,

Ve se alguem consegue ajudar, eu estou com um grande problema no bundle.
Tenho um arquivo .properties e esse mapeado certinho pois já existem propriedades que funcionam normalmente mas quando eu coloco uma nova propriedade nesse .properties e aponto no jsp da erro, ex:

meu arquivo .properties esta assim:

value.sim=Sim
value.nao=Não

e o jsp Assim:

<bean:message key="value.sim"/>
<bean:message key="value.nao"/>

até então legal tudo funciona perfeitamente mas quando eu coloco um novo registro:

novo registro no .properties :

value.sim=Sim
value.nao=Não
value.um=um

e o jsp Assim:

<bean:message key="value.sim"/>
<bean:message key="value.nao"/>
<bean:message key="value.um"/>

Ai que esta o problema ele da um erro que não consegue encontrar esse bundle:

[12/05/10 09:22:47:825 BRT] 00000021 WebApp        E   [Servlet Error]-[action]: java.util.MissingResourceException: Can't find resource for bundle java.util.PropertyResourceBundle, key value.um
	at java.util.ResourceBundle.getObject(ResourceBundle.java:342)
	at java.util.ResourceBundle.getString(ResourceBundle.java:302)

Se alguem souber o que possa estar acontecendo agradeço.

Vlw…Flw

L

Geralmente é quando não está registrado no bundle

Criado 9 de agosto de 2007
Ultima resposta 7 de fev. de 2014
Respostas 19
Participantes 7