2013-06-14 5 views
4

Я знаю, что вообще не разрешено обращаться к локальным файлам (с java.io) внутри EJB: тем не менее, у меня есть EJB, который должен открыть файл Excel и отредактировать его, используя apache.poi библиотека. Если я что-то вроде этого:Открыть файл в EJB

@Stateless 
public class MyEJB { 

public void editExcel(){ 
... 
InputStream in = MyEJB.class.getClassLoader().getResourceAsStream("/xls/ExcelFile.xls"); 

final Workbook generatedExcel = new XLSTransformer().transformXLS(in, beans); 
... 

} } 

Структура файловой системы:

MyEar.ear 
--my-ejb.jar 
---com 
-----company 
-------ejbs 
----------MyEJB.class 
---xls 
-----ExcelFile.xls 

В этом случае я получить экземпляр ZipFile $ ZipFileInputStream (частный внутренний класс ZipFileInputStream) и XLSTransformer сгенерирует IllegalArgumentException («Ваш InputStream не был ни потоком OLE2, ни потоком OOXML»), поскольку он ожидает InputStream, представляющий ExcelFile.xls, и вместо этого получает поток, представляющий весь my-ejb.jar.

Мои вопросы: вы знаете, как решить эту ситуацию? Какова наилучшая практика для доступа к файлу в EJB?

Большое спасибо!

+0

Что происходит, когда вы удаляете, что слэш? (см. также [эта запись] (http://stackoverflow.com/questions/1464291/how-to-really-read-text-file-from-classpath-in-java)) – kiwiwings

+0

Это не поможет ..: ( – Federico

ответ

2

Я также должен был вернуть модифицированный XLS-шаблон из контейнера EE. Хотя я всегда рассматриваю такие ресурсы не как часть развертывания WAR/EAR, а как настраиваемый объект, управляемый клиентами.

Таким образом, одним из простых решений может быть сохранение вашего шаблона в каталоге конфигурации и предоставление его пути & имени JNDI для вашего приложения.

НО

Вы также можете использовать JNDI для представления более сложного типа данных, представляющих собой файл Excel, так что ваш код EJB остается свободным от прямых файловых операций.

Вы можете найти некоторые указатели (для JBoss AS JNDI) здесь: http://middlewaremagic.com/jboss/?p=1690

Смежные вопросы