2011-09-14 4 views
1

мой applicationContext.xml, webmvc-config.xml в WEB-INF/весна/applicationContext.xmlне может импортировать ApplicationContext в тестовом классе

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

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

я использую весной 3, JUnit 4.7.

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

и я изменил нагрузку на:

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

мой 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> 

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

+2

Какое местоположение вашего пути? Если это сервлет, то обычно это «WEB-INF/classes», что означает, что вы должны сохранить файл applicationContext в 'WEB-INF/classes/spring/applicationContext.xml' и использовать конфигурацию как' @ContextConfiguration (location = {"classpath: spring/applicationContext.xml"}) ' –

ответ

2

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

я положил файл applicationContex.xml в каталоге:

src/main/resources/META-INF/spring 

и в Интернете.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" }) 
6

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

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

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

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

+0

жаль, что я не понимаю, что вы подразумеваете, поставив мой контекст в: WEB-INF/classes/spring, вы хотите создать новую папку в WEB-INF, или в целевом/классе создайте новую папку под названием spring или what, я не могу ее получить. –

+0

target/classes - это каталог, в котором Maven компилирует классы и копирует ресурсы. После компиляции ваша сборка, вероятно, генерирует военный файл или взорванный военный файл. Этот файл войны или взорванный файл войны - это то, что используется сервером приложений для запуска вашего веб-приложения. А сервер приложений не волнует, как организованы ваши источники и какой инструмент построения вы используете для построения войны. Важна структура военного файла, который должен уважать спецификацию JEE. Поэтому поместите файл там, где он должен быть таким, чтобы * после сборки * он находился в WEB-INF/classes/spring на войне. –

+0

Если вы используете Maven, поместите его в каталог src/resources/spring, чтобы он перешел на WEB-INF/classes/spring после сборки. Но это может зависеть от вашего pom.xml. –

1

Я держу мои файлы контекста приложения в (SRC/основные/ресурсов) и добавить суффикс пути класс для доступа к ним из теста или web.xml

Чтобы получить доступ к контекстным файл, который находится в SRC/главная/ресурсы из (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 
{ 
} 
+0

выше делается для applicationContext only или всех файлов конфигурации Spring, таких как mvc-config, security, servlet. –

+0

я имею в виду, я должен сделать то же самое для Mvc конфигурации: <сервлет-имя> р <имя сервлета /> <сервлет-класс> org.springframework.web.servlet.DispatcherServlet contextConfigLocation \t \t \t * Путь к классам: webmvc-конфигурации.XML \t \t \t \t \t \t \t \t \t <нагрузки на старте> 1

+0

Я делаю это для всех их, но я думаю, что это имеет делать с моим личным предпочтением сохранение всех моих конфигурационных файлов в каталоге src/main/resources. Я оставлю это до вас, где вы хотите файлы конфигурации mvc/security/servlet, хотя –

1

Другое решение состоит в добавление к основнымам ApplicationContext/SRC/ресурсам.

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

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

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

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