Spring MVC Получить файл под WEB-INF без запроса

Я пытаюсь получить файл (или каталог) в/WEB-INF/.../

вне запроса. Мне нужно это в bean-компоненте, загруженном при запуске сервера.

Все решения, которые я могу найти, хотят получить файл XML, используяClassPathXmlApplicationContext или запрос на получение контекста сервлета или использование текущего исполняемого класса. Мне некрасиво.

Как я могу получитьFile("/WEB-INF/myDir/"). Должен быть способ, нет!?

Ответы на вопрос(7)

Я используюВесн DefaultResourceLoader а такжеРесур для чтения внутри WEB-INF или любых ресурсов в файле * .jar. Работай как шарм. Удачи

import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;

public static void myFunction() throws IOException {
    final DefaultResourceLoader loader = new DefaultResourceLoader();               
    LOGGER.info(loader.getResource("classpath:META-INF/resources/img/copyright.png").exists());             
    Resource resource = loader.getResource("classpath:META-INF/resources/img/copyright.png");           
    BufferedImage watermarkImage = ImageIO.read(resource.getFile());
}
 Derp10 нояб. 2016 г., 12:51
DefaultResourceLoader не могу читать внутри WEB-INF, вам понадобитсяServletContextResource за эт

если файл находится вWEB_INF\classes каталог. Который где любые файлы в вашемsrc/main/resources каталог будет скопирован с использованием обычной сборки maven ...

import org.springframework.core.io.Resource
...
final Resource yourfile = new ClassPathResource( "myfile.txt");
 axtavt26 июн. 2012 г., 17:35
/WEB-INF/myDir/ не является ресурсом classpath.
 NimChimpsky26 июн. 2012 г., 17:37
@ axtavt о да, предполагалось, что это был WEB-INF / classes
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("files/test.xml").getFile());

ces»

request.getSession().getServletContext().getResourceAsStream("yourfile.pdf");
Решение Вопроса

вы можете получить экземплярServletContext (с помощьюServletContextAware, или с помощью автоматической проводки).

Затем вы можете получить доступ к файлам в каталоге веб-приложения напрямую getResourceAsStream(), getRealPath()) или используяServletContextResource.

EDIT от momo:

@Autowired
ServletContext servletContext;

... myMethod() { 
     File rootDir = new File( servletContext.getRealPath("/WEB-INF/myDIR/") );
}
 bizzr311 окт. 2014 г., 12:13
+ 1 дляservletContext.getRealPath("/WEB-INF/myDIR/")
 Dani12 авг. 2015 г., 08:43
Решение, предоставленное @mahesh чуть ниже, намного лучше, потому что уровень сервиса не должен иметь зависимостей от веб-уровня. ServletContext должен выполняться только в контроллерах и тому подобное.
 Philippe Gioseffi11 янв. 2016 г., 19:05
Plus, метод getRealPath может возвращать ноль в зависимости от того, какой сервер приложений и / или приложение было развернуто, например .war в weblogic.

если вы просто хотите получить к нему доступ из Службы (не через ServletContext):

    final DefaultResourceLoader loader = new DefaultResourceLoader();
    Resource resource = loader.getResource("classpath:templates/mail/sample.png");
    File myFile = resource.getFile();

Обратите внимание, что последняя строка может броситьIOException так что тебе нужно поймать / отбросить

Обратите внимание, что файл находится здесь:src\main\resources\templates\mail\sample.png

 momomo08 сент. 2015 г., 08:34
Спасибо, но вопрос был в том, чтобы получить его под WEB-INF

но ... Вот несколько универсальных решений, которые я использовал для загрузки свойств из любого места веб-приложения, как это делает Spring (с поддержкой WEB-INF / ..., classpath: ..., file :. ..). Это основано на использованииServletContextResourcePatternResolver. Тебе понадобитсяServletContext.

private static Properties loadPropsTheSpringWay(ServletContext ctx, String propsPath) throws IOException {
    PropertiesFactoryBean springProps = new PropertiesFactoryBean();
    ResourcePatternResolver resolver = new ServletContextResourcePatternResolver(ctx);
    springProps.setLocation(resolver.getResource(propsPath));
    springProps.afterPropertiesSet();
    return springProps.getObject();
}

Я использовал описанный выше метод в моем пользовательском прослушивателе контекста сервлета, пока conext еще не был загружен.

Ваш ответ на вопрос