在web.xml中包含文件

4
我正在为一个JEE5 Web服务编写单元测试。Web服务的行为取决于web.xml文件中设置的属性。因此,我想将我的web.xml文件分成一个常量部分和在测试运行之间进行更改的部分。
为了确定是否可能,我尝试了一下是否可以拆分出welcome-file-list属性。使用我找到的一些说明,我得到了以下结果: web.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd" [
  <!ENTITY fragment SYSTEM "fragment.xml">
]>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <listener>
        <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>NewWebService</servlet-name>
        <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>NewWebService</servlet-name>
        <url-pattern>/NewWebService</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
  &fragment;
</web-app>

fragment.xml

<?xml version="1.0" encoding="UTF-8"?>
<welcome-file-list>
  <welcome-file>index.jsp</welcome-file>
</welcome-file-list>

然而,我在 web.xml 文件上遇到了验证错误:

元素类型“web-app”必须声明属性“version”。[7]
元素类型“web-app”必须声明属性“xmlns”。[7]
元素类型“web-app”必须声明属性“xmlns:xsi”。[7]
元素类型“web-app”必须声明属性“xsi:schemaLocation”。[7]

我感觉问题出在使用一个 v2.3 的 web app DTD 和一个 v2.5 的 schema 在同一个文件中,但我不知道如何解决。
(如果有其他方法将一个 web.xml 文件分成较小的部分也可以接受。) 更新 如果我删除 DTD 引用,像这样:...
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app[
  <!ENTITY fragment SYSTEM "fragment.xml">
]>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
etc, etc, etc.

看起来验证过程忽略了web-app_2_5.xsd文件:

元素类型"web-app"必须声明。[5]
元素类型"listener"必须声明。[6]
元素类型"listener-class"必须声明。[7]
元素类型"servlet"必须声明。[9]
等等,等等。


不要这样做!你基本上是利用了一个Tomcat特定的安全漏洞,这个漏洞在更新的Tomcat版本中已经修复,并且不一定存在于其他服务器中。换句话说,具有这种web.xml的Web应用程序是不可移植的。相关问题报告:https://bugzilla.redhat.com/show_bug.cgi?id=1069911 - BalusC
1个回答

1
我最终在我的 Web 服务中添加了一个钩子,用于检查是否存在 eproperties 文件。如果找到了这个文件,它就知道它处于测试模式,而不是使用 web.xml 中指定的值,而是从属性文件中提取它们。虽然不太优雅,但至少它能工作。属性文件由 JUnit 测试在 @BeforeClass 方法期间复制到 WEB-INF 目录中。鉴于这种方法的成功,我一直在思考是否将 Web 应用程序设置存储在 web.xml 中是最好的选择...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接