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”).
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.
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