2014-01-16 30 views
12

我是新來的球衣和網絡服務,我嘗試運行一個簡單的RESTful Web服務。我遵循http://www.mkyong.com/webservices/jax-rs/jersey-hello-world-example/,但我的項目沒有使用maven,我下載了jersey.1.17.1.jar並將其包含到我的項目路徑中。不知道爲什麼:ResourceConfig實例不包含任何根資源類

當我想打電話http://localhost:8080/sycotext/rest/service/SOMETEXT的服務,我得到這個錯誤:

HTTP Status 500 - Servlet.init() for servlet sycoText-servlet threw exception 

這是堆棧跟蹤:

javax.servlet.ServletException: Servlet.init() for servlet sycoText-servlet threw exception 
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504) 
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:76) 
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:934) 
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:515) 
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1010) 
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:640) 
    org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223) 
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1618) 
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1576) 
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    java.lang.Thread.run(Thread.java:724) 

root cause 

com.sun.jersey.api.container.ContainerException: The ResourceConfig instance does not contain any root resource classes. 
    com.sun.jersey.server.impl.application.RootResourceUriRules.<init>(RootResourceUriRules.java:99) 
    com.sun.jersey.server.impl.application.WebApplicationImpl._initiate(WebApplicationImpl.java:1331) 
    com.sun.jersey.server.impl.application.WebApplicationImpl.access$700(WebApplicationImpl.java:168) 
    com.sun.jersey.server.impl.application.WebApplicationImpl$13.f(WebApplicationImpl.java:774) 
    com.sun.jersey.server.impl.application.WebApplicationImpl$13.f(WebApplicationImpl.java:770) 
    com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:193) 
    com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:770) 
    com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:765) 
    com.sun.jersey.spi.container.servlet.ServletContainer.initiate(ServletContainer.java:489) 
    com.sun.jersey.spi.container.servlet.ServletContainer$InternalWebComponent.initiate(ServletContainer.java:319) 
    com.sun.jersey.spi.container.servlet.WebComponent.load(WebComponent.java:605) 
    com.sun.jersey.spi.container.servlet.WebComponent.init(WebComponent.java:210) 
    com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:374) 
    com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:557) 
    javax.servlet.GenericServlet.init(GenericServlet.java:160) 
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504) 
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:76) 
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:934) 
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:515) 
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1010) 
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:640) 
    org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223) 
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1618) 
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1576) 
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    java.lang.Thread.run(Thread.java:724) 

這裏是我的代碼:

package ir.sycotech.text.server.service; 

import javax.ws.rs.*; 
import javax.ws.rs.core.Response; 

@Path("/service") 
public class SycoTextService { 
    @GET 
    @Path("/{param}") 
    public Response getMsg(@PathParam("param") String msg) { 
     String output = "Jersey say : " + msg; 
     return Response.status(200).entity(output).build(); 
    } 

這裏是我的web.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app id="WebApp_ID" version="2.4" 
     xmlns="http://java.sun.com/xml/ns/j2ee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 

    <display-name>Restful Web Application</display-name> 


    <servlet> 
     <servlet-name>sycoText-servlet</servlet-name> 
     <servlet-class> 
      com.sun.jersey.spi.container.servlet.ServletContainer 
     </servlet-class> 
     <init-param> 
      <param-name>com.sun.jersey.config.property.packages</param-name> 
      <param-value>ir.sycotech.text.server.service</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>sycoText-servlet</servlet-name> 
     <url-pattern>/rest/*</url-pattern> 
    </servlet-mapping> 

</web-app> 

我已經在web.xml文件中正確指定我的包名,我不知道爲什麼我得到這個錯誤,我會如果有人知道這是什麼問題可以真正體會

+0

可能init()方法丟失。 – Ved

+0

你能解釋一下嗎? –

+1

乾淨的Apache Tomcat將工作... –

回答

24

錯誤:

com.sun.jersey.api.container.ContainerException: The ResourceConfig instance does not contain any root resource classes.

表示澤西島找不到服務類別。這可能是由於com.sun.jersey.config.property.packages參數的錯誤命名包所導致的,或者包名稱正確但它不包含資源類(人們有時會忘記在類上添加@Path註釋)。

但我找不到任何錯誤的設置。所以這應該工作!

檢查您的應用程序是否正確部署,並確認您的WEB-INF/classes文件夾實際上包含您的班級與正確的文件夾路徑的包。

做一個完整的清理和重建,然後再試一次。

+3

非常感謝我發現了問題,問題是在戰爭文件。我使用intelliJ的想法13,它是人工產物生成的戰爭文件,它只是做錯了方式,我不知道爲什麼它把包放在war文件的根文件夾中: –

+2

謝謝。這讓我瘋狂。就我而言,在課前我錯過了@Path。我有路徑的方法,但一般路徑丟失,我有在控制檯相同的錯誤 –

+1

同樣的問題@VahidHaratian說也發生在IntelliJ IDEA 14.0.2終極版。文件夾類在根文件夾中生成,不在WEB-INF內部。我的項目是Maven項目,我不知道它是否發生在非Maven項目中。 –

0

我不是沒有你遇到的實際問題。 可以dwonload一個例子https://github.com/kdmalviyan/RestWithJerseyExample.git 你要下載後執行以下操作:1. MVN全新安裝 2.部署戰爭到你的服務器 3.訪問「JerseyExample-0.0.1-SNAPSHOT/REST /打招呼/你好Kuldeep辛格」你的服務器

上你會得到這樣的輸出:澤西說:您好Kuldeep辛格

我建議你遵循沒有任何改變任何事情首先具體步驟。如果你得到正確的結果,那麼你可以根據你的需要進行修改。請確定您是否正在重命名軟件包,並在web.xml中重命名軟件包。

0

我剛剛遇到了這個問題,使用灰熊與澤西島。

當你啓動一個灰熊容器時,你必須通過一張地圖告訴灰熊在哪裏找到你的資源。如果你像我一樣從一個原型創建你的項目,或者只是移動了一些東西,你還必須更新這個容易忽略的值。

final static String YOUR_PACKAGE_NAME_GOES_HERE = "where.ever.your.resource.package.happens.to.be" 

    final Map<String, String> initParams = new HashMap<String, String>(); 

    initParams.put("com.sun.jersey.config.property.packages", 
      YOUR_PACKAGE_NAME_GOES_HERE); 

    System.out.println("Starting grizzly..."); 
    SelectorThread threadSelector = GrizzlyWebContainerFactory.create(BASE_URI, initParams); 
0

我也遇到了這個問題。我做了兩件事讓它起作用,第一件與這個問題無關。

首先,我使用球衣1.19。但是,我沒有意識到在服務器上有一個名爲 javax.ws.rs-api-2.0.jar的文件,其中WEB-INF/lib。這個文件是兩年前添加的,IIRC與澤西2.x一起使用,但不是1.x.我有效地刪除了該文件(將其重命名爲.bak作爲其擴展名)。

其次,我在Eclipse中爲Web服務創建了一個JAR文件。我沒有使用Maven或Ant或類似的東西。只是一個簡單的出口。現在,錯誤可能意味着代碼中沒有任何引用球衣的東西。但我想,我寫了一個簡單的測試課,一切都應該工作。原來,導出並未正確創建JAR文件。我打開了JAR,這個班是空的。難怪它會產生這個錯誤!我再次出口,而不是選中標記Export generated class files and resources,我選中標記Export all output folders for checked projects。我在這個項目中也有多個軟件包,這可能與導出無法正常工作的原因有關。一旦我做到了,它就起作用了!

我再次嘗試導出,但這一次,我勾選了Export generated class files and resources並選擇了項目中的每個資源。與上次不同的是我選擇了.settings。上次未選擇.settings。同樣,這也起作用了!

我希望這可以幫助那些有類似問題的人。有時候,這只是確認你的JAR文件是正確的。我使用java decompiler來檢查JAR文件。

0

我遇到類似的問題。請檢查您的初始化過程是否已正確註冊api類。

在你的情況下,初始化類是ir.sycotech.text.server.service

您需要註冊服務的所有API類。

這是我的例子:

我會打的錯誤,如果以下類沒有註冊,(註冊(CtoFService.class); 寄存器(FtoCService.class); 寄存器(TriggerCmd.class); )

*<init-param> 
     <param-name>javax.ws.rs.Application</param-name> 
     <param-value>my.mimos.hcserver.init.MyApplication</param-value> 
    </init-param>* 



@ApplicationPath("/HCRestServer/") 
public class MyApplication extends ResourceConfig{ 
    public MyApplication() { 
     System.out.println("******Started!*****"); 
     register(CtoFService.class); 
     register(FtoCService.class); 
     register(TriggerCmd.class); 
     register(CORSResponseFilter.class); 
     System.out.println("******Done registration!*****"); 
    } 
} 
0

請確保您的包「com.sun.jersey.config.property.packages」在web.xml中正確註冊...祝你好運!

<servlet> 
     <servlet-name>Jersey REST Service</servlet-name> 
     <servletclass>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
    <init-param> 
    <param-name>com.sun.jersey.config.property.packages</param-name> 
    <param-value>com.rest.service</param-value> 
    </init-param> 
    <init-param> 
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> 
    <param-value>true</param-value> 
    </init-param>   
    <load-on-startup>1</load-on-startup> 
    </servlet> 
0

如果您嘗試使用HttpServerFactory,則必須傳遞PackagesResourceConfig。

實施例:

ResourceConfig rc = new PackagesResourceConfig("com.package"); 
HttpServerFactory.create(getBaseURI(), rc); 
0

我有同樣的問題,這是我通過同時指定類的包併除去解決負載上啓動完全的,即:

<servlet> 
    <servlet-name>my-servlet-name</servlet-name> 
    <servlet-class> 
     com.sun.jersey.spi.container.servlet.ServletContainer 
    </servlet-class> 
    <init-param> 
     <param-name>com.sun.jersey.config.property.packages</param-name> 
     <param-value>my.package.name</param-value> 
    </init-param> 
    <!-- <load-on-startup>1</load-on-startup> --> 
</servlet> 

我想因爲我在同一個軟件包下有多個servlet,Jersey coudn't選擇在啓動時加載的「root」。

0

好吧,沒有上述答案爲我工作。不過,他們讓我仔細檢查每一步和包名。正如Bogdan所說,target/classes/文件夾中沒有編譯過的類。

Check that your application deployed correctly and that your WEB-INF/classes folder actually contains your class with the proper folder path for the package.

我的解決方案只是清理項目和編譯不同。而不是隻是去mvn war:war我所做的:

$ mvn clean:clean $ mvn compile $ mvn war:war

然後,它編譯罰款和OP錯誤消失。

相關問題