Leitura de Arquivo em EJB

Pessoal,
Eu preciso que um EJB (no caso um MDB) consiga ler um arquivo XSD para validar um XML.
Li em vários lugares que operações de I/O não devem ser feitas pelo EJB. Mas acredito que leitura de arquivos não seja problema, desde que o caminho não seja absoluto (para não ter problemas com cluster).
Eu tinha caminhos absolutos e agora desejo corrigir esta situação.
Alguém tem alguma sugestão?
Tentei usar URLs, obtidas através da aplicação Web, as quais guardei em variáveis estáticas. Porém os EJBs não reconhecem o caminho da URL (“jndi:/localhost/Aplicacao/…/arquivo.xsd”).

Obrigada pela ajuda,
Fernanda

Fernanda,

No Caso o uso de I/O deixa o seu EJB sem a garantia de ser portável entre os servidores de aplicação pois a especificação diz para não utilizar, ou seja, o container deveria barrar. Porém alguns podem ser que permitam.

Acredito que para seu problema uma alternativa seria o uso de JAXB que transforma o XML em objeto. Com ele você conseguirá além de validar seu xml, transforma-lo em objeto e trabalhar de maneira mais simples. O JAXB vai utilizar seu XSD para a transformação pois a partir do XSD são geradas as classes de marshaling e unmarshaling.

Da uma olhadinha nesse link: http://www.onjava.com/pub/a/onjava/2004/12/15/jaxb.html

Abraço e espero ter ajudado.

De fato, o problema do XSD é que as APIs que conheço exigem que você use o nome de um arquivo de verdade - elas deveriam poder usar “resources” ou URLs, mas elas normalmente só aceitam nomes de arquivos (absolutos ou relativos; o problema dos relativos é que normalmente são relativos ao diretório em que o seu application server for iniciado, ou seja, sei lá qual.), ou então URLs na Internet (como http://blablabla), que normalmente demoram muito para serem acessadas pelo seu programa.

O melhor que você pode fazer é pôr o nome absoluto de um arquivo em um diretório conhecido (por exemplo, um diretório compartilhado via NFS).

No caso do JAXB você vai utilizar o XSD antes para gerar as classes. No momento da validação/transformação não vai precisar fazer I/O o que não vai ferir a regra da especificação EJB