我正在使用JUnit测试用例来使用嵌入式Tomcat行使我的Web服务。在Tomcat 6下,一切都工作正常,但是当我将项目切换到Tomcat 7时,我将无法使用。
设置嵌入式Tomcat服务器的测试代码如下:
Embedded container = new Embedded(); container.setCatalinaHome("C:\\Program Files\\Apache Software Foundation\\Tomcat 7.0.11"); container.setRealm(new MemoryRealm()); container.setName("Catalina"); Engine engine = container.createEngine(); container.addEngine(engine); Host host = container.createHost("localhost", "/DecoderServiceTest"); Context rootContext = container.createContext("/DecoderServiceTest", System.getProperty("user.dir") + "/build/web"); host.addChild(rootContext); engine.setName("Catalina"); engine.addChild(host); engine.setDefaultHost("localhost"); container.addEngine(engine); Connector connector = container.createConnector(InetAddress.getLocalHost(), 4321, false); container.addConnector(connector); container.start();
由于嵌入式API在版本6和版本7之间进行了更改,因此我将自己的代码更改为以下内容:
Tomcat tomcat = new Tomcat(); tomcat.setBaseDir("C:\\Program Files\\Apache Software Foundation\\Tomcat 7.0.11"); tomcat.setPort(1234); tomcat.addWebApp("/DecoderServiceTest", System.getProperty("user.dir")+"/build/web"); tomcat.setHostname("localhost"); tomcat.start();
当我执行JUnit测试时,实际的Web服务可以正常启动(我可以使用Web浏览器并看到提供了WSDL)。
但是,在Web服务的构造函数中,我根据web.xml文件(位于中System.getProperty("user.dir")+"/build/web/WEB- INF/web.xml")的值初始化一些变量,如下所示:
web.xml
System.getProperty("user.dir")+"/build/web/WEB- INF/web.xml"
Context initCtx = new InitialContext(); Context envCtx = (Context) initCtx.lookup("java:comp/env"); int thumbnailSize = (Integer) envCtx.lookup("thumbnail-pixel-size");
我的web.xml文件包含以下条目:
<env-entry> <env-entry-name>thumbnail-pixel-size</env-entry-name> <env-entry-type>java.lang.Integer</env-entry-type> <env-entry-value>64</env-entry-value> </env-entry>
当我尝试创建envCtx对象时,出现消息NamingExceptionName java:comp is not bound in this Context。我很困惑,因为它可以在Tomcat 6上正常工作。我是否错过了以前在Tomcat 6设置中定义的Tomcat 7设置?
envCtx
Name java:comp is not bound in this Context
马克·托马斯通过tomcat-users邮件列表建议
tomcat.enableNaming();
在服务器启动之前。这对我有用(我想他们将默认行为更改为6到7)。