Как заменить web.xml файлами конфигурации контекста приложения?

Фон

Я пытаюсь реализовать интеграционный тест для контроллера весной. Я не хочу использовать WebApplicationInitializer (Конфигурация Java для Spring) для запуска моего веб-приложения. Я хочу использовать конфигурации на основе XML. Тем не мение, @ContextConfiguration не мог загрузить web.xmlтак я и создал application-context.xml, Проблема в web.xml а также application-context.xml служат той же цели,

Вопрос

Могу ли я удалить web.xml в пользу application-context.xml? Если я удалю web.xmlтест пройдёт, но веб-приложение не будет работать в Tomcat.

коды

Это мой тестовый класс:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"file:path/to/application-context.xml"})
@WebAppConfiguration
public class HelloControllerIntegrationTest {

    @Autowired
    private WebApplicationContext context;

    private WebClient webClient;

    @Before
    public void setup() throws Exception {
        MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(context).build();

        webClient = new WebClient();
        webClient.setWebConnection(new MockMvcWebConnection(mockMvc));
    }

    @Test
    public void testPrintWelcome() throws Exception {
        // I'm trying to print out the page for now
        UnexpectedPage welcomePage = webClient.getPage("http://localhost/");
        InputStream is = welcomePage.getInputStream();
        java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A");
        String a = s.hasNext() ? s.next() : "";
        System.out.println(a);
    }
}

Это мое application-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/mvc
                           http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
                           http://www.springframework.org/schema/context
                           http://www.springframework.org/schema/context/spring-context-3.2.xsd">

    <mvc:annotation-driven/>

    <mvc:default-servlet-handler/>

    <context:component-scan base-package="com.company.controller"/>

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
    </bean>
</beans>

1 ответ

Решение

Что вам нужно понять, так это web.xml а также application-context.xml служить двум совершенно различным целям.

Первый используется для настройки приложения для запуска в контейнере сервлета, а второй - для настройки Spring. web.xml конечно, может быть заменен конфигурацией на основе Java, когда контейнер поддерживает спецификацию сервлета 3.0 или новее.

При запуске теста Spring MVC для проверки контроллера Spring, web.xml не используется вообще, так как тест не выполняется в контейнере сервлета, потому что тестовая среда макетирует все зависимости. Вы могли бы легко иметь Spring MVC тесты для кода, который проходит, но не имеет web.xml вообще, если вы находитесь в среде TDD.

В заключение, проблемы, решаемые web.xml а также application-context.xml являются ортогональными, и один может использоваться, не заботясь о другом.

Также, чтобы уточнить, конфигурация предоставлена web.xml или WebApplicationInitializer альтернатива не может быть предоставлена ​​в application-context.xml

Другие вопросы по тегам