Вопрос по java, maven, spring – Как получить доступ к файлу в папке статических ресурсов (WEB-INF) из ссылочного проекта Java?

2

У меня есть веб-приложение, которое содержит XML-файл конфигурации для одной из моих служб приложений, представленной в виде Spring Bean. Кроме того, у меня есть автономное Java-приложение (которое ссылается на мой проект веб-приложения из его pom.xml) в том же рабочем пространстве, которое выполняет тесты с использованием среды Spring TestContext, и один из тестов проверяет конфигурацию этого XML-файла.

Однако у меня есть проблема с доступом к этому XML-файлу из автономного приложения:

Перед настройкой теста в моей предыдущей конфигурации файл был доступен через ServletContext и находился вWEB-INF/ папка. Однако, чтобы сделать его доступным из тестового проекта, мне пришлось переместить его вsource/ папку и загрузите ее с помощью метода getClassLoader (). getResourceAsStream () вместо метода ServletContext. Но это делает редактирование файла громоздким, потому что каждый раз, когда приложение должно быть повторно развернуто.

Можно ли сохранить файл вWEB-INF/ папку, но загрузить ее из ссылочного проекта во время тестовых прогонов?

Постскриптум В настоящее время это проект STS с сервером Tomcat.

Ваш Ответ

4   ответа
1

$ webapp / WEB-INF / classes

Проекты Maven будут копировать вещи из $ module / src / main / resources в это место при упаковке веб-приложения. (первый является исходным путем, второй - WEB-INF / classes - всегда помещается в classpath контейнером сервлета, согласно спецификации.)

Error: User Rate Limit Exceeded Boris Treukhov
Error: User Rate Limit Exceededwiki.eclipse.org/Jetty/Feature/…
Error: User Rate Limit Exceeded Boris Treukhov
2

MockServletContext класс и внедрение его непосредственно в мой служебный бин до запуска теста, так как мой сервис реализованServletContextAware :

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/test-ctx.xml" } ) 
public class SomeServiceTest {

@Autowired
private MyServletContextAwareService myService;

@Before
public void before(){
            //notice that I had to use relative path because the file is not available in the test project
    MockServletContext mockServletContext = new MockServletContext("file:../<my web project name>/src/main/webapp"); 

    myService.setServletContext(mockServletContext);        
}

Если бы у меня было несколько классов, использующих Servlet Context, то лучшим решением было бы использоватьWebApplicationContext вместо этого по умолчанию (в настоящее время предоставляется DelegatingSmartContextLoader), но это потребует реализации пользовательскихContextLoader класс и передавая его имя класса@ContextConfiguration аннотаций.

alternative and somewhat cleaner solution что позже пришло мне в голову, чтобы реорганизовать службу и внедритьServletContext  с помощью@Autowired вместо того, чтобы возиться сServletContextAwareи предоставить бин соответствующего типа (эффективноMockServletContext пример).

Possibly, in future the direct support of MockServletContext from test classes will be added to Spring see SPR-5399 а такжеSPR-5243.

UPDATE FOR SPRING 3.2 In Spring 3.2 initialization of the servlet context became as simple as adding one @WebAppConfiguration аннотация:

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration("file:../<my web project name>/src/main/webapp")
@ContextConfiguration(locations = { "/test-ctx.xml" } ) 
public class SomeServiceTest {

подробности смотрите встатья

5

если он находится там, где он должен находиться.

Для ваших тестовых классов, которые выполняются из командной строки. Вы можете использовать getClassLoader (). GetResource () для файла, который, как вы знаете, находится в корне вашего пути к классам (например, файл application.properties). Оттуда вы знаете структуру вашего проекта и где найти WEB-INF / относительно файла свойств. Поскольку он возвращает URL, вы можете использовать его для определения пути к файлам XML, которые вы ищете.

URL url = this.getClass().getClassLoader().getResource("application.properties");
System.out.println(url.getPath());

File file = new File(url.getFile());
System.out.println(file);

// now use the Files' path to obtain references to your WEB-INF folder

Надеюсь, вы найдете это полезным. Мне приходилось делать предположения о том, как проходят ваши тестовые занятия и т. Д.

Посмотрите наКласс файла и это методы getPath (), getAbsolutePath () и getParent (), которые могут быть вам полезны.

Error: User Rate Limit Exceeded Boris Treukhov
Error: User Rate Limit Exceeded
2

ontext и я не мог получить доступ к статическому файлу в Каталог WEB-INF. Я нашел решение, добавив запись в pom.xml, которая дала мне доступ к каталогу. Это фактически включает этот путь к пути к классам.

PS: я использовал контейнер Tomcat

<project>
    <build>
    <resources>
        <resource>
            <directory>src/main/webapp/WEB-INF</directory>
        </resource>
    </resources>
</project>

Похожие вопросы