缺少有效web.xml中web-fragment.xml的元素

时间:2012-06-12 08:48:20

标签: java tomcat

在我们的项目中,我们使用web片段来定义一些servlet,以便可以在其他项目中轻松使用工件。

现在奇怪的是我们有一个web-fragment.xml,但是它的一些内容没有被添加到有效的web.xml中。

以示例:

以下配置存在于有效的web.xml中:

<filter>
    <filter-name>superUserAutomaticLogon</filter-name>
    <filter-class>nl.caiw.cool.util.filters.SuperUserAutomaticLogonFilter</filter-class>
    <async-supported>false</async-supported>
</filter>

但以下不是:

<filter>
    <filter-name>sitemesh</filter-name>
    <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>sitemesh</filter-name>
    <url-pattern>/toolbox/modules/*</url-pattern>
</filter-mapping>

我们尝试了几件事,但我们无法弄明白。希望有人可以向我们发送正确的方向。

提前致谢。

2 个答案:

答案 0 :(得分:11)

  

现在奇怪的是我们有一个web-fragment.xml,但是它的一些内容没有被添加到有效的web.xml中。

首先,web-fragment.xml不会将物理包含在主web.xml中。所以当你说它没有被添加到有效的web.xml时,我觉得你可能会在那里出错。

Web片段允许组件在运行时将自己注册到主web.xml。您将发现这种情况的唯一证据是实际尝试使用该组件。

我尝试了一个简单的hello-world示例,其中包含Web片段并使其正常工作。我使用Servlet 3.0 webapp使用Tomcat 7。

web.xml内的主WEB-INF如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<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_3_0.xsd" id="WebApp_ID" version="3.0">
    <display-name>hello-world</display-name>

    <absolute-ordering>
        <name>filters</name>
    </absolute-ordering>
</web-app>

我发现我们唯一可以注册web-fragment.xml的是遵守以下规则:

  1. 必须将其命名为web-fragment.xml
  2. 必须将其放在WEB-INF/lib
  3. 内的JAR文件中
  4. web-fragment.xml必须出现在JAR文件的META-INF目录中。
  5. 我的web-fragment.xml看起来像是:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-fragment 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-fragment_3_0.xsd" id="WebAppFragment_ID" version="3.0">
        <name>filters</name>
        <filter>
            <filter-name>interceptor</filter-name>
            <filter-class>com.adarshr.Interceptor</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>interceptor</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    </web-fragment>
    

    通过上述最小化设置,我可以让Interceptor过滤器被触发,但它被放置在web-fragment.xml

    最后,这是我的目录结构(使用http://www.adarshr.com/treegen生成)

    +- hello-world
       |
       +- WEB-INF
           |
           +- lib
           |   |
           |   |- my-library.jar
           |
           |- web.xml
    

    JAR文件my-library.jar具有以下结构:

    +- my-library.jar
       |
       +- META-INF
           |
           |- web-fragment.xml
    

    一些参考文献:

答案 1 :(得分:2)

也许您可以查看web.xml未设置metadata-complete="true"。根据Servlet规范,如果此标志设置为true,则不会加载web-fragment.xml或任何注释,例如@WebFilter