2013-03-08 139 views
1

我们想使用arquillian测试我们的REST API。使用arquillian测试REST Web服务

我们使用glassfish进行生产和arquillian。

我们已经对我们公开的一些JMS队列进行了arquillian测试,并且工作正常,所以我们至少有一些基础知识是正确的。 当我们开始使用设置为REST测试,在我们对REST的网址发第一HTTP GET,我们得到了异常: com.sun.jersey.api.container.ContainerException: No WebApplication provider is present.

这里是我们拆封安装:

public static WebArchive createTestArchive() { 
    return ShrinkWrap.create(WebArchive.class, "test.war") // Create jar 
      .addPackages(true, "<our packages, plus some dependencies>") //, "com.ocpsoft.pretty") 
      .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml") // b 
      .setWebXML("WEB-INF/web.xml") 
      .addAsWebInfResource("WEB-INF/faces-config.xml") 
      //.addAsWebInfResource(new StringAsset("<faces-config version=\"2.0\"/>"), "faces-config.xml") 
      .addAsResource("META-INF/test-persistence.xml", "META-INF/persistence.xml"); 

} 

我认为我们的web.xml文件是相关的:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<web-app 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_3_0.xsd" 
    version="3.0"> 

    <servlet> 
     <servlet-name>Faces Servlet</servlet-name> 
     <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>  
    </servlet> 
    <servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>*.xhtml</url-pattern> 
    </servlet-mapping> 
    <context-param> 
     <param-name>javax.faces.DEFAULT_SUFFIX</param-name> 
     <param-value>.xhtml</param-value> 
    </context-param> 


    <!-- Pretty faces config --> 

    <filter> 
     <filter-name>Pretty Filter</filter-name> 
     <filter-class>com.ocpsoft.pretty.PrettyFilter</filter-class> 
     <async-supported>true</async-supported> 
    </filter> 

    <filter-mapping> 
     <filter-name>Pretty Filter</filter-name> 
     <url-pattern>/*</url-pattern> 
     <dispatcher>FORWARD</dispatcher> 
     <dispatcher>REQUEST</dispatcher> 
     <dispatcher>ERROR</dispatcher> 
     <dispatcher>ASYNC</dispatcher> 
    </filter-mapping> 

    <!-- disable annotation scanning by the PrettyFaces module --> 
    <context-param> 
     <param-name>com.ocpsoft.pretty.BASE_PACKAGES</param-name> 
     <param-value>none</param-value> 
    </context-param> 

</web-app> 

编辑:由于这个问题,我现在已经改变到GlassFish嵌入式3.1.1和更新的问题BAS编辑新的错误信息。 我们使用glassfish 3.1.2作为主要操作。

另外请注意,我们首先得到一个警告:

WARNING: Could not instantiate service class org.glassfish.osgicdi.impl.OSGiServiceExtension 
java.lang.NoClassDefFoundError: org/osgi/framework/ServiceException 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:791) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) 

[..]

Caused by: java.lang.ClassNotFoundException: org.osgi.framework.ServiceException 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 

(但似乎是安全的忽略警告,看到这一点,它链接到的bug :http://www.java.net/forum/topic/glassfish/glassfish/could-not-instantiate-service-class-orgglassfishosgicdiimplosgiserviceextension?force=217

然后错误:

SEVERE: WebModule[/test]StandardWrapper.Throwable 
com.sun.jersey.api.container.ContainerException: No WebApplication provider is present 
    at com.sun.jersey.spi.container.WebApplicationFactory.createWebApplication(WebApplicationFactory.java:69) 
    at com.sun.jersey.spi.container.servlet.ServletContainer.create(ServletContainer.java:391) 
    at com.sun.jersey.spi.container.servlet.ServletContainer$InternalWebComponent.create(ServletContainer.java:306) 
+1

你使用什么样的arquillian容器(Glassfish one i suppose)?如果嵌入,它是否与您的目标服务器的版本完全相同? – Gab 2013-03-08 14:04:25

回答

3

好的,在Gab的评论的帮助下(绝不会让它没有提示!),我解决了这个问题。 该评论使我专注于软件包的版本,并且我意识到我们用于生产的glassfish 3.1.2使用球衣1.11,而我们现在用于测试的glassfish-embedded 3.1.1(因为没有3.1.2截至撰写本文时),使用球衣1.8。

所以我加入了以下依存关系到我们的pom.xml的试验段:

<!-- glassfish 3.1 ships with jersey 1.8, hence the version here. --> 
<dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-server</artifactId> 
    <version>1.8</version> 
    <scope>provided</scope> 
    </dependency> 
    <dependency> 
    <groupId>com.sun.jersey.contribs</groupId> 
    <artifactId>jersey-multipart</artifactId> 
    <version>1.8</version> 
    </dependency> 
    <dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-json</artifactId> 
    <version>1.8</version> 
    </dependency> 

我已经离开了依赖于球衣在我们的pom.xml对球衣1.11指向的主要部分。

现在问题解决了。

我希望我们可以得到一个更好的错误消息,为这样的问题!