2014-05-24 2 views
3

Я использую следующий метод, чтобы получить ресурс из WAR-файла в WildFly:WildFly - получение ресурсов из WAR

this.getClass().getResource(relativePath) 

Это работает, когда приложение развертывается в разобранном WAR. Используется для работы со сжатой WAR. Вчера я сделал чистую и восстановил проект в Eclipse, и он просто прекратил работать.

Когда я проверяю корень ресурса:

logger.info(this.getClass().getResource("/").toExternalForm()); 

я получаю это:

file:/C:/JBoss/wildfly8.1.0.CR1/modules/system/layers/base/org/jboss/as/ejb3/main/timers/ 

Таким образом, не удивительно, что она не работает. Вероятно, это связано с загрузкой модуля JBoss, но я не знаю, является ли это ошибкой или нормальным поведением.

Я нашел различные подобные проблемы в StackOverflow, но не применимое решение. Одно из предложений заключается в использовании ServletContext так:

@Resource 
private WebServiceContext wsContext; 
... 
ServletContext servletContext = (ServletContext)this.wsContext.getMessageContext() 
     .get(MessageContext.SERVLET_CONTEXT); 
servletContext.getResource(resourcePath); 

Но, когда я пытаюсь получить MessageContext таким образом, я получаю IllegalStateException. Поэтому я в основном застрял. Есть идеи?

+0

откуда, вы пытаетесь открыть код? – UVM

+0

Из метода @GET в веб-сервисе JAX-RS. –

+0

В частности, из метода @GET в ** безстоящем ** веб-службе JAX-RS. –

ответ

1

Я, наконец, сдался и поместил свои файлы ресурсов в новый модуль JBoss, как описано в этой ссылке.

https://community.jboss.org/wiki/HowToPutAnExternalFileInTheClasspath

Он работает, но недостатком является то, что есть две цели развертывания таким образом вещи являются более сложными. С другой стороны, размер файла WAR уменьшается, и мне не нужно повторно развертывать приложение, если изменились только некоторые из ресурсов.

2

У нас была аналогичная проблема, и наша вина заключалась в том, что мы пытались получить доступ к статическому ресурсу по необработанному пути вместо использования входного потока, который предоставляет ресурс - следующий код работает для нас даже при развертывании не взорванных. войны файл.

final URL resource = this.getClass().getResource(FILE); 

try (final InputStream inputStream = resource.openStream(); 
    final InputStreamReader inputStreamReader = new InputStreamReader(inputStream); 
    final BufferedReader bufferedReader = new BufferedReader(inputStreamReader)) { 
    // Use bufferedReader to read the content 
} catch (IOException e) { 
    // ... 
} 
+0

Спасибо. У меня нет времени проверить это сейчас, но, возможно, это поможет кому-то другому. –

+0

Этот certianly работал для меня. Благодаря! –

2

Я столкнулся с этой же проблемой, и вместо того, чтобы определять ресурс как общий модуль, я закончил работать вокруг этого с помощью контекста сервлета в моей WAR.

В контекстеInitialized метода я получил ServletContext из ServletContextEvent и использовал его getResource ("/ WEB-INF/myResource"), чтобы получить URL-адрес ресурса внутри моего WAR-файла. Похоже, что в ServletContextListener метод .getResource() решает как ожидалось, а не URL-адрес/modules/system/layers/base/org/jboss/as/ejb3/main/timers /. Этот URL-адрес затем может быть сохранен в ServletContext для последующего использования сервлетами или в инъецированном компоненте ApplicationScoped CDI.

@WebListener 
public class ServletInitializer implements ServletContextListener { 

    @Override 
    public void contextInitialized(ServletContextEvent sce) { 
     try { 
      final ServletContext context = sce.getServletContext(); 
      final URL resourceUrl = context.getResource("/WEB-INF/myResource"); 
      context.setAttribute("myResourceURL", resourceUrl); 
     } catch (final MalformedURLException e) { 
      throw new AssertionError("Resource not available in WAR file", e); 
     } 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent sce) {} 
} 

или

@WebListener 
public class ServletInitializer implements ServletContextListener { 

    @Inject 
    private SomeApplicationScopedBean myBean; 

    @Override 
    public void contextInitialized(ServletContextEvent sce) { 
     try { 
      final ServletContext context = sce.getServletContext(); 
      final URL resourceUrl = context.getResource("/WEB-INF/myResource"); 
      myBean.setResourceUrl(resourceUrl); 
     } catch (final MalformedURLException e) { 
      throw new AssertionError("Resource not available in WAR file", e); 
     } 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent sce) {} 
} 
0

Недавно я пытаюсь выяснить, как получить доступ к файлу в пределах своей собственной войны в Java. Ниже показано, как классы Java и ресурсы упакованы в файл войны:

WAR 
`-- WEB-INF 
     `-- classes (where all the java classes are) 
     `-- resourcefiles 
        `-- resourceFile1 

Мой целевой файл был resourceFile1.Чтобы получить этот файл, я просто сделал следующее в коде:

InputStream inStream = this.class.getClassLoader().getResourceAsStream("resourcefiles/resourceFile1"); 

В этом случае файлы ресурсы должны были бы находиться в той же папке, что и папка классов, содержащих классы Java. Надеюсь, другие считают это полезным.

0

Этот пример кода работает для wildfly, развернутого и протестированного в режиме спуска. Я думаю, что это проблема дикой природы, я дикая дикая природа и попробовал на местном, я также получаю ошибку. Пример: я пробовал пример кода по ссылке ниже, он работает для tomcat, но не для wildfly. http://websystique.com/springmvc/spring-mvc-4-file-download-example/ поместить файл под ресурсами/файл

import org.springframework.web.bind.annotation.RequestMethod;  
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.URLConnection; 

@Controller 
@RequestMapping 
public class FileDownloadController { 

    private static final Logger logger = LoggerFactory.getLogger(FileDownloadController.class); 

    private static final String DOC_FILE = "file/ibrahim-karayel.docx"; 
    private static final String PDF_FILE = "file/ibrahim-karayel.pdf"; 


    @RequestMapping(value = "/download/{type}", method = RequestMethod.GET) 
    public void downloadFile(HttpServletRequest request, HttpServletResponse response, 
          @PathVariable("type") String type) throws IOException { 

     File file = null; 
     InputStream inputStream; 
     if (type.equalsIgnoreCase("doc")) { 
      inputStream = getClass().getClassLoader().getResourceAsStream(DOC_FILE); 
      file = new File(Thread.currentThread().getContextClassLoader().getResource(DOC_FILE).getFile()); 
     } else if (type.equalsIgnoreCase("pdf")) { 
      inputStream = getClass().getClassLoader().getResourceAsStream(PDF_FILE); 
      file = new File(Thread.currentThread().getContextClassLoader().getResource(PDF_FILE).getFile()); 
     } else{ 
      throw new FileNotFoundException(); 
     } 
     if (file == null && file.getName() == null) { 
      logger.error("File Not Found -> " + file); 
      throw new FileNotFoundException(); 
     } 

     String mimeType = URLConnection.guessContentTypeFromName(file.getName()); 
     if (mimeType == null) { 
      System.out.println("mimetype is not detectable, will take default"); 
      mimeType = "application/octet-stream"; 
     } 

     System.out.println("mimetype : " + mimeType); 
     response.setContentType(mimeType); 
     /* "Content-Disposition : inline" will show viewable types [like images/text/pdf/anything viewable by browser] right on browser 
      while others(zip e.g) will be directly downloaded [may provide save as popup, based on your browser setting.]*/ 
     response.setHeader("Content-Disposition", String.format("inline; filename=\"" + file.getName() + "\"")); 

     /* "Content-Disposition : attachment" will be directly download, may provide save as popup, based on your browser setting*/ 
     //response.setHeader("Content-Disposition", String.format("attachment; filename=\"%s\"", file.getName())); 

     response.setContentLength(inputStream.available()); 
     IOUtils.copy(inputStream, response.getOutputStream()); 
     response.flushBuffer(); 
     inputStream.close(); 
    } 
} 
Смежные вопросы