【问题标题】:How to replace web.xml with application context config files?如何用应用程序上下文配置文件替换 web.xml?
【发布时间】:2014-07-02 22:26:26
【问题描述】:

背景

我正在尝试在 Spring 中实现控制器的集成测试。我想使用 WebApplicationInitializer(Spring 的 Java 配置)来运行我的 Web 应用程序。我想使用基于 xml 的配置。但是@ContextConfiguration无法加载web.xml,所以我创建了application-context.xml。问题是web.xmlapplication-context.xml 的目的是一样的,

问题

我可以删除web.xml 以支持application-context.xml 吗?如果我删除 web.xml,测试会通过,但 Web 应用程序不会在 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>

【问题讨论】:

  • 您的测试代码是否通过? Spring MVC 测试与你是否使用 web.xml 来初始化应用程序无关,因为它永远不会在 servlet 容器中启动应用程序。
  • @geo 是的,所有测试都通过了。没有抛出异常。

标签: java spring-mvc tomcat7 integration-testing web.xml


【解决方案1】:

您需要了解的是,web.xmlapplication-context.xml 服务于两个完全不同的目的。

第一个用于配置应用程序以在 servlet 容器中运行,而第二个用于提供 Spring 配置。当容器支持 servlet spec 3.0 或更高版本时,web.xml 当然可以替换为基于 Java 的配置。

当运行 Spring MVC 测试以测试 Spring 控制器时,根本不使用 web.xml,因为测试没有在 servlet 容器中运行,因为测试框架模拟了所有依赖项。您可以轻松地对通过的代码进行 Spring MVC 测试,但如果您在 TDD 环境中,则根本没有 web.xml

总之,web.xmlapplication-context.xml 解决的问题是正交的,可以使用一个而不关心另一个。

另外澄清一下,web.xmlWebApplicationInitializer 替代提供的配置不能在 application-context.xml 中提供

【讨论】:

  • 但是我必须在web.xmlapplication-context.xml中维护两组相同的配置,这不是我想要的。我想找到一种方法,以便 servlet 容器可以识别 application-context.xml 并在没有 web.xml 的情况下运行。
  • 在常规服务器环境中运行时,需要引导 Spring。这可以在web.xmlWebApplicationInitializer 中完成。运行 Spring MVC 测试没关系,因为环境是 mock 的,你只需要引用 Spring 配置
  • 也就是说我必须使用web.xmlWebApplicationInitializer,没有其他选项。不可能是application-context.xml,对吧?如果是这样并且您想更改答案,那么我将您的答案标记为正确。谢谢。
  • 没问题!我更新了答案并在最后进行了澄清
猜你喜欢
  • 2017-11-09
  • 2015-08-31
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多