我正嘗試使用嵌入式碼頭來自動測試Web服務。但是,當我嘗試訪問服務時,我不斷收到錯誤404。嵌入式碼頭用於自動化測試
這是我的src /主/ web應用/ WEB-INF/web.xml文件:
<?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_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>Snafucator</display-name>
<session-config>
<session-timeout>60</session-timeout>
</session-config>
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>Snafucator</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:snafucator.service.xml</param-value>
</context-param>
<servlet>
<servlet-name>jaxws-servlet</servlet-name>
<servlet-class>com.sun.xml.ws.transport.http.servlet.WSSpringServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>jaxws-servlet</servlet-name>
<url-pattern>/Snafucator</url-pattern>
</servlet-mapping>
我也希望我的src /測試/資源在類路徑,因爲它們含有的設置DAO和實現該服務的其他組件。該服務所需的所有bean都在snafucator.service.xml中配置。這主要通過加載幾個spring上下文文件來實現。這些是從較低層文件和定義該服務綁定和執行snafucator.context.xml:
<import resource="classpath*:setup.context.xml" />
<import resource="classpath*:core.context.xml" />
<import resource="classpath*:snafucator.context.xml" />
Morever,我需要的類路徑上目標/類,因爲它包含了snafucator.context.xml:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:ws="http://jax-ws.dev.java.net/spring/core" xmlns:wss="http://jax-ws.dev.java.net/spring/servlet"
xmlns:security="http://www.springframework.org/schema/security"
xmlns:util="http://www.springframework.org/schema/util" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.0.xsd
http://jax-ws.dev.java.net/spring/core
http://jax-ws.dev.java.net/spring/core.xsd
http://jax-ws.dev.java.net/spring/servlet
http://jax-ws.java.net/spring/servlet.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- enable autowiring by annotations -->
<context:annotation-config />
<wss:binding url="/Snafucator">
<wss:service>
<ws:service bean="#snafucatorWs" />
</wss:service>
</wss:binding>
<bean id="snafucatorWs" class="com.snafu.SnafucatorWSImpl" />
我這是怎麼開始的碼頭:
server = new Server(iPort);
WebAppContext root = new WebAppContext();
root.setExtraClasspath("target/classes/,src/test/resources/");
root.setDescriptor("src/main/webapp/WEB-INF/web.xml");
root.setResourceBase("src/main/webapp");
root.setWar("src/main/webapp");
root.setContextPath("/");
root.setServer(server);
root.setParentLoaderPriority(true);
server.setHandler(root);
System.out.println("Starting jetty server on port:" + iPort);
server.start();
System.out.println("Jetty server is started!");
當我訪問"http://localhost:8082"
時,我看到WEB-INF和META-INF目錄,因此Jetty正在運行。當我嘗試"http://localhost:8082/Snafucator"
時,出現錯誤404,命令行顯示「JAX-WS-Servlet已初始化」。當我訪問"http://localhost:8082"
下的任何其他url時,我會得到一個稍微不同的格式化的404。所以我假設有一些WS處理髮生。 我也在開發一個Web應用程序,該服務被設計爲其中的一部分。當我將snafucator.context.xml包含到應用程序的上下文中並使用jetty eclipse插件啓動應用程序時,一切正常。但是對於自動化測試,我需要單獨啓動服務。
順便說一下,我使用的是Jetty 7.6.14。
我在做什麼錯?
我不確定root.setWar()在這種情況下工作。如果你有興趣,我可以發佈我的嵌入Jetty沒有WAR的方式完美的測試和使用彈簧。 – JosefN
嗨JosefN,我已經看到了這種使用setWar在這裏的各種地方http://stackoverflow.com/questions/3718221/add-resources-to-jetty-programmatically或這裏https://today.java.net/pub /a/today/2007/04/12/embedded-integration-testing-of-web-applications.html,其中setWar由WebAppContext的構造函數調用。但我不在乎它是如何工作的,只要它有效:-)所以,如果你有一個運行的例子,我會很高興嘗試一下。 – avidD