Не удается импортировать applicationContext в тестовом классе - PullRequest
2 голосов
/ 14 сентября 2011

my applicationContext.xml, webmvc-config.xml находятся в WEB-INF / spring / applicationContext.xml

, когда я пытаюсь выполнить следующее, он не загружается, и я получаю java.io.FileNotFoundException

@ContextConfiguration(locations = { "classpath:WEB-INF/spring/applicationContext.xml" })

Я использую Spring 3, Junit 4.7.

, он работает с грязным обходным путем, копируя applicationContext.xml в папку ресурсов, поэтому он дублируется.

, и я изменилсязагрузка по адресу:

@ContextConfiguration(locations = { "classpath:/applicationContext.xml" })

my web.xml:

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">

  <!-- start up and shut down Spring's root WebApplicationContext (Interface to provide configuration for a web application) -->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  <!-- Central dispatcher for HTTP request handlers/controllers: take an incoming URI and find the right combination of handlers (generally methods on Controller classes) 
  and views (generally JSPs) that combine to form the page or resource that's supposed to be found at that location. -->
  <servlet>
    <servlet-name>p</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>
            /WEB-INF/spring/webmvc-config.xml                       
            </param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>p</servlet-name>
    <url-pattern>/p/*</url-pattern>
  </servlet-mapping>

  <!-- allows one to specify a character encoding for requests. 
  This is useful because current browsers typically do not set a character encoding even if specified in the HTML page or form -->
  <filter>
    <filter-name>encoding-filter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>utf-8</param-value>
    </init-param>
    <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>

  <filter-mapping>
    <filter-name>encoding-filter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
  </filter-mapping>

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
      /WEB-INF/spring/applicationContext.xml
    </param-value>
  </context-param>

  <!--  
  <filter>
  <filter-name>springSecurityFilterChain</filter-name> 
  <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
  </filter>

 <filter-mapping>
  <filter-name>springSecurityFilterChain</filter-name> 
  <url-pattern>/*</url-pattern> 
  </filter-mapping>  
  -->


  <!-- Based on the popular and very useful mod_rewrite for apache, UrlRewriteFilter is a Java Web Filter for any J2EE
       compliant web application server (such as Resin or Tomcat), which allows you to rewrite URLs before they get to your
       code. It is a very powerful tool just like Apache's mod_rewrite. -->
  <filter>
  <filter-name>UrlRewriteFilter</filter-name> 
  <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
  </filter>

  <filter-mapping>
  <filter-name>UrlRewriteFilter</filter-name> 
  <url-pattern>/*</url-pattern> 
  </filter-mapping>


</web-app>

, пожалуйста, посоветуйте лучшее решение.

Ответы [ 4 ]

7 голосов
/ 14 сентября 2011

Путь к классу веб-приложения состоит из

  • WEB-INF / классы
  • все банки под WEB-INF / lib

Итак, если вы хотите загрузить файл контекста из пути к классам, он вам нужен в одном из этих мест. Поместите его в WEB-INF/classes/spring и загрузите, например, classpath:spring/applicationContext.xml.

РЕДАКТИРОВАТЬ: Я только что понял, что у вас есть проблема при загрузке файла контекста из теста JUnit. Ответ похож, хотя. Каталог, содержащий WEB-INF, безусловно, не находится в classpath вашего модуля модульного тестирования. Исполнитель модульных тестов должен использовать более или менее тот же путь к классам, что и сервер приложений, поэтому файл должен находиться в месте, которое делает его доступным к файлу JAR или каталогу, который находится в пути к классам теста после сборки. Если используется Maven, каталог src/main/resources обычно является одним из них: все в этом каталоге идет в каталог target/classes, который находится в пути к классам модуля модульного тестирования.

3 голосов
/ 27 сентября 2011

ну, наконец-то я смог сделать это следующим образом (на основе spring roo сгенерированного приложения):

Я поместил свой файл applicationContex.xml в каталог:

src/main/resources/META-INF/spring

и в web.xml:

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:META-INF/spring/applicationContext*.xml</param-value>
</context-param>

и в классе модульных испытаний:

@ContextConfiguration(locations = { "classpath:/META-INF/spring/applicationContext.xml" })
1 голос
/ 01 марта 2012

Другим решением является добавление applicationContext в main / src / resources.

Также добавьте (второй) контекст приложения (для сервлета) в META-INF, используя только одну строку, которая импортирует первый контекст из пути к классам

  <import resource="classpath:/mypackage/my-servlet.xml"/>

Затем вы можете импортировать первое в тест, и нет повторяющихся определений.

1 голос
/ 14 сентября 2011

Я храню файлы контекста своего приложения в (src / main / resources) и добавляю суффикс пути к классу для доступа к ним из test или web.xml

Для доступа к файлу контекста, который находится в src / main/ resources from (web.xml), добавьте этот конфиг в ваш web.xml

 <context-param>
  <description>
           Context parameters for Spring ContextLoaderListener     
      </description>
   <param-name>contextConfigLocation</param-name>
    <param-value>
        classpath*:applicationContext.xml
    </param-value>
  </context-param>

  <listener>
     <listener-class>
           org.springframework.web.context.ContextLoaderListener
        </listener-class>
  </listener>

Вот так выглядит моя тестовая конфигурация

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:applicationContext.xml"})
@Transactional
public class MyTest 
{
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...