如何在Web.xml中注册Spring @Configuration注释类而不是applicationContext.xml文件?


68

我在Web应用程序中一起使用jsf和spring。我已经在一个配置类中配置了数据源和会话工厂,该配置类使用了诸如此类的注释@Configuration, @ComponentScan我在我的项目中没有任何applicationContext.xml文件,因为我正在处理Configuration类中上下文xml的每个条目。该测试用例成功运行,但是当我部署Web应用程序时,它给了我错误

java.lang.IllegalStateException:找不到WebApplicationContext:没有注册ContextLoaderListener吗?

现在,如果我在web.xml中提供侦听器类,

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

它给我错误,

找不到/WEB-INF/applicationContext.xml

根据的文档ContextLoaderListener,的确是,如果我没有明确给出contextConfigLocationparam web.xml,它将搜索名为applicationContext.xml中的默认spring上下文文件web.xml。现在,如果我不想使用spring上下文文件,并使用批注进行所有配置,该怎么办?我应该如何注册侦听器类,ContextLoaderListener以便在不使用xml文件且仅使用批注的情况下,能够使用spring和jsf运行Web应用程序?

Answers:


133

web.xml你需要引导上下文AnnotationConfigWebApplicationContext

<servlet>
    <servlet-name>appServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextClass</param-name>
        <param-value>
            org.springframework.web.context.support.AnnotationConfigWebApplicationContext
        </param-value>
    </init-param>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            org.package.YouConfigurationAnnotatedClass
        </param-value>
    </init-param>
</servlet>

而且不要忘记使用 @EnableWebMvcMVC注释。

进一步阅读:

编辑为“评论跟进” =>要完成图灵:

是的,您当然需要听众。尽管以上内容完全回答了“如何在Web.xml中注册Spring @Configuration带注释的类而不是applicationContext.xml文件”的问题,但这是Spring官方文档中的一个示例,该示例对整个布局进行布局web.xml

<web-app>
  <!-- Configure ContextLoaderListener to use AnnotationConfigWebApplicationContext
       instead of the default XmlWebApplicationContext -->
  <context-param>
      <param-name>contextClass</param-name>
      <param-value>
          org.springframework.web.context.support.AnnotationConfigWebApplicationContext
      </param-value>
  </context-param>

  <!-- Configuration locations must consist of one or more comma- or space-delimited
       fully-qualified @Configuration classes. Fully-qualified packages may also be
       specified for component-scanning -->
  <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>com.acme.AppConfig</param-value>
  </context-param>

  <!-- Bootstrap the root application context as usual using ContextLoaderListener -->
  <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  <!-- Declare a Spring MVC DispatcherServlet as usual -->
  <servlet>
      <servlet-name>dispatcher</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <!-- Configure DispatcherServlet to use AnnotationConfigWebApplicationContext
           instead of the default XmlWebApplicationContext -->
      <init-param>
          <param-name>contextClass</param-name>
          <param-value>
              org.springframework.web.context.support.AnnotationConfigWebApplicationContext
          </param-value>
      </init-param>
      <!-- Again, config locations must consist of one or more comma- or space-delimited
           and fully-qualified @Configuration classes -->
      <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>com.acme.web.MvcConfig</param-value>
      </init-param>
  </servlet>

  <!-- map all requests for /app/* to the dispatcher servlet -->
  <servlet-mapping>
      <servlet-name>dispatcher</servlet-name>
      <url-pattern>/app/*</url-pattern>
  </servlet-mapping>
</web-app>

嗨,我这里没有使用Spring MVC,只有JSF和Spring 3.1 RC1。尽管我在web.xml中编写了该servlet,但仍然收到相同的错误“未注册ContextLoaderListener”。然后,我为spring的侦听器类进行了输入,然后发现未找到applicationContext.xml的其他错误。我希望我能阐明我的观点。
Mital Pritmani 2011年

嘿,当我在web.xml中添加这两个参数作为上下文参数和spring侦听器类时,它起作用了。谢谢,您的回答帮助我找到了答案。我正在编辑您的答案以添加我的解决方案。您请批准它(因为我没有编辑权限),以便我可以将您的答案标记为最终答案。
Mital Pritmani 2011年

我从未收到您的编辑请求,但是我web.xml以Spring官方文档的完整示例更新了我的答案。
tolitius 2011年

在我的Web应用程序配置中,我必须<load-on-startup>1</load-on-startup>在调度程序servlet中。没有此调度程序,则无法加载
marioosh

@tolitius,感谢<!-- Configure DispatcherServlet to use AnnotationConfigWebApplicationContext instead of the default XmlWebApplicationContext -->您的回答,因为它帮助我理解了这一点
Plain_Dude_Sleeping_Alone

11

在这里碰到一个老问题,但是如果您将应用程序部署在支持Servlet 3.0+的Web容器上,则现在可以完全摆脱Spring(v3.0 +)的版本。

可以实现Spring的WebApplicationInitializer界面来进行与web.xml中相同的配置。在Servlet 3.0+容器上运行的Spring 3.0+应用程序将自动检测到此实现类。

如果设置非常简单,则可以使用Spring提供的另一个类,如下所示。这里要做的只是设置@Configuration类并列出servlet映射。使设置极其简单。

public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer{

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return null;
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {

        return new Class[] {AppConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] {
                 "*.html"
                ,"*.json"
                ,"*.do"};
    }
}

2
如果确实尝试摆脱web.xml,请确保使用的容器支持Tomcat Tomcat 7.0.57之类的Servlet 3.0 。PS史蒂夫,带引号的逗号很不错!
贾斯汀·沃贝尔

确实如此。我会把它丢在答案里。谢谢
Angad
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.