在使用jersey框架搭建服務時,常常會報出以下異常

在使用jersey框架搭建服務時,常常會報出以下異常:java

Java代碼  收藏代碼web

  1. com.sun.jersey.api.container.ContainerException: The ResourceConfig instance does not contain any root resource classes.  
        at com.sun.jersey.server.impl.application.RootResourceUriRules.<init>(RootResourceUriRules.java:99)  
        at com.sun.jersey.server.impl.application.WebApplicationImpl._initiate(WebApplicationImpl.java:1331)  
        at com.sun.jersey.server.impl.application.WebApplicationImpl.access$700(WebApplicationImpl.java:168)  
        at com.sun.jersey.server.impl.application.WebApplicationImpl$13.f(WebApplicationImpl.java:774)  
        at com.sun.jersey.server.impl.application.WebApplicationImpl$13.f(WebApplicationImpl.java:770)  
        at com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:193)  
        at com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:770)  
        at com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:765)  
        at com.sun.jersey.spi.container.servlet.ServletContainer.initiate(ServletContainer.java:489)  
        at com.sun.jersey.spi.container.servlet.ServletContainer$InternalWebComponent.initiate(ServletContainer.java:319)  
        at com.sun.jersey.spi.container.servlet.WebComponent.load(WebComponent.java:605)  
        at com.sun.jersey.spi.container.servlet.WebComponent.init(WebComponent.java:210)  
        at com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:374)  
        at com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:557)  
        at javax.servlet.GenericServlet.init(GenericServlet.java:212)  
        at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1206)  
        at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1026)  
        at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4421)  
        at org.apache.catalina.core.StandardContext.start(StandardContext.java:4734)  
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:799)  
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:779)  
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:601)  
        at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1079)  
        at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:1002)  
        at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:506)  
        at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1317)  
        at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:324)  
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:142)  
        at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1065)  
        at org.apache.catalina.core.StandardHost.start(StandardHost.java:840)  
        at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1057)  
        at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463)  
        at org.apache.catalina.core.StandardService.start(StandardService.java:525)  
        at org.apache.catalina.core.StandardServer.start(StandardServer.java:754)  
        at org.apache.catalina.startup.Catalina.start(Catalina.java:595)  
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)  
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)  
        at java.lang.reflect.Method.invoke(Method.java:597)  
        at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)  
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)

 下面是出現這種異常的幾種狀況spring

一、在不與spring整合,而是直接使用jersey搭建服務時,若是隻在web.xml 中配置了以下代碼:apache

<servlet>
  <servlet-name>abc</servlet-name>
   
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
   <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
  <servlet-name>abc</servlet-name>
  <url-pattern>/services/*</url-pattern>
  </servlet-mapping>

 

此時啓動tomcat,會報出上面的異常,緣由是實例張不包含任何啓動資源的類,你要確保實例已經建立,例如:api

Java代碼  收藏代碼tomcat

  1. @Path("abc")  
    @Produces("application/xml")  
    @Consumes("application/xml")  
    public class Abc  
    {  
        @POST  
        @Produces("application/xml")  
        @Consumes("application/xml")  
        public void abc(){  
              
        }  
          
    }

 這樣再啓動,就能夠了。服務器

二、在與spring整合中時,若是出現如上異常,緣由多是:app

1)缺乏spring-jersey.jar包框架

將spring-jersey.jar包添加到工程lib下,而後修改下web.xml配置文件ui

<servlet>
  <servlet-name>abc</servlet-name>
   
<servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
   <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
  <servlet-name>abc</servlet-name>
  <url-pattern>/services/*</url-pattern>
  </servlet-mapping>

而後再從新啓動tomcat,就能夠了。

2)若是按照1)操做完成後,tomcat啓動仍然報上面的異常,此時須要在web.xml中在從新添加點配置信息(紅色部分):

<servlet>
  <servlet-name>abc</servlet-name>
  <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
  
<init-param>
  <param-name>com.sun.jersey.config.property.packages</param-name>
   <param-value>com.xxyd.map.webservice</param-value><!--表明的是你服務端的路徑,要和你的工程服務器端路徑保持一致-->
  </init-param>
  <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
  <servlet-name>abc</servlet-name>
  <url-pattern>/services/*</url-pattern>
  </servlet-mapping>

 此時再啓動tomcat就能夠了。

 

固然,還有一種方式就是從新將「com.sun.jersey.spi.spring.container.servlet.SpringServlet」替換回「com.sun.jersey.spi.spring.container.servlet.SpringServlet」,但若是是這樣的話,就失去了spring與jersey整合的意義了,不提倡如此解決。


二、衝突問題

java.lang.AbstractMethodError: javax.ws.rs.core.UriBuilder.uri(Ljava/lang/String;)Ljavax/ws/rs/core/


導入jersey jar 包就不要再導入javax.ws.rs,會引起衝突

相關文章
相關標籤/搜索