2011-05-24 74 views
20

雖然這是一個古老的問題,我仍然無法找到答案,使這項工作。 如果您發現我的任何聲明不正確,請更正。新澤西州的REST的ResourceConfig實例不包含任何根資源類

我有一個Java臉應用,並使用REST的Web服務。我不認爲臉孔與我的問題有任何關係。 的web.xml文件是:

<servlet> 
    <servlet-name>NDREST</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>com.bi.nd.webservice</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>NDREST</servlet-name> 
    <url-pattern>/nd/*</url-pattern> 
</servlet-mapping> 

我有相當的web.xml中多了一些的servlet既然是用面應用與特立尼達和多巴哥等

在包com.bi.nd. webservice,我的資源類是:

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBElement; 
import javax.xml.bind.Marshaller; 

import javax.ws.rs.Consumes; 
import javax.ws.rs.GET; 
import javax.ws.rs.POST; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.MediaType; 

@Produces(MediaType.APPLICATION_XML) 
@Path("/hello") 
public class TransactionResource 
{ 
public TransactionResource() 
{ 
} 

@GET 
@Produces(MediaType.TEXT_PLAIN) 
public String itWorks() 
{ 
    return "Get is OK"; 
} 
} 

事實上,我的類有一個@GET足以標識自己的資源類。
更別說其他的複雜性,我編譯使用Ant我的源代碼在Eclipse中,我得到這個錯誤在catalina.out的文件:

May 24, 2011 8:48:46 AM com.sun.jersey.api.core.PackagesResourceConfig init 
INFO: Scanning for root resource and provider classes in the packages: 
    com.bi.nd.webservice 
May 24, 2011 8:48:46 AM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate 
INFO: Initiating Jersey application, version 'Jersey: 1.7 05/20/2011 11:04 AM' 
May 24, 2011 8:48:46 AM com.sun.jersey.server.impl.application.RootResourceUriRules <init> 
SEVERE: The ResourceConfig instance does not contain any root resource classes. 

一些建議,複製asm.jar,JSR-api.jar文件,jersey-server.jar和jersey-core.jar到應用程序WEB-INF/lib中。我做到了,但仍然無法工作。 我發現這個建議有點奇怪,因爲WEB-INF/lib是Eclipse將從構建路徑安裝所有依賴庫的地方。這不是我們手動放置庫的地方。

一些人解釋說,這個錯誤與Java插件和澤西編寫的方式有關。但那是幾年前。

有人可以向我解釋爲什麼我一直存在這個問題嗎?

跟進: 儘管從REST網站,定義爲根資源類的資源類是POJO(普通舊Java對象),它們或者用@Path註釋或者至少有一個用@Path註釋的方法或者請求方法指示符如@GET,@PUT,@ POST或@DELETE。資源方法是使用請求方法標識符註釋的資源類的方法。本節介紹如何使用Jersey來註釋Java對象以創建RESTful Web服務。

我不得不@Path(「/你好」)添加到我的課,突然澤西可以找到我的資源類

現在catalina.out的文件看起來像:

May 24, 2011 3:13:02 PM com.sun.jersey.api.core.PackagesResourceConfig init 
INFO: Scanning for root resource and provider classes in the packages: 
com.bi.nd.webservice 
May 24, 2011 3:13:02 PM com.sun.jersey.api.core.ScanningResourceConfig logClasses 
INFO: Root resource classes found: 
class com.bi.nd.webservice.TransactionResource 
May 24, 2011 3:13:02 PM com.sun.jersey.api.core.ScanningResourceConfig init 
INFO: No provider classes found. 
May 24, 2011 3:13:02 PM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate 
INFO: Initiating Jersey application, version 'Jersey: 1.7 05/20/2011 11:04 AM' 

但問題遠未結束。我嘗試訪問網址http://localhost:8080/nd/hello,但我仍然收到404 NOT FOUND。提供者類是不是一個重要的消息?

+0

找到並解決了一個問題。 – user759646 2011-05-24 19:19:23

+5

你能分享你修復的問題嗎?我有同樣的問題!即使我用細齒梳過了所有東西,我仍然收到404 – 2011-06-09 17:12:07

回答

7

我發現澤西可能無法找到根資源的另一個原因。錯誤信息是一樣的,所以我認爲這是一個很好的理由來記錄其中的根源,以防其他人絆倒它。

我有上有下注釋的根資源類:

@Singleton 
@Path("/helloWorld") 
@Service(...) // my own custom annotation 
public class MyRootResource { 
... 
} 

這將導致內澤西根資源掃描失敗。

的修復方法就是改變註釋的順序:

@Service(...) // my own custom annotation 
@Singleton 
@Path("/helloWorld") 
public class MyRootResource { 
... 
} 

這工作。

+0

爲我工作,我正在使用@RequestMapping(value =「/ api」),然後通過@Path(「/ api」)更改 – 2016-10-09 17:27:34

2

我發現「找不到提供程序類」消息是可怕的,但並不重要。

「ResourceConfig實例不包含任何根資源類」是一個更大的問題。

我發現資源類需要用@Path註釋,而提供者類(如果有的話 - 我們使用一個用於將例外映射到HTTP響應代碼)需要用@Provider註釋,並且兩者都需要在正確的包裝中,然後澤西會找到它們。

1

您可能需要使用URL這樣

http://localhost:8080/<web_context_root>/nd/hello 
+0

或者我們可以更改server.xml文件中的Web_Context_Root。 – 2013-09-13 10:00:22

5

首先,請注意,一類具有@GET是不夠的,標識爲根資源類;該類必須有一個@Path。你的確如此,所以這不是問題。

我和你有同樣的問題:它在Eclipse中工作,但當我爲外部使用而構建它時沒有工作。

我使用的是嵌入式碼頭,有一個main(),看起來像這樣:

public static void main(String argv[]) 
{ 
    try 
    { 
     // from http://wiki.eclipse.org/Jetty/Tutorial/Embedding_Jetty 
     Server server = new Server(8080); 
     ServletContextHandler contextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS); 
     contextHandler.setContextPath("/"); 
     server.setHandler(contextHandler); 

     // http://stackoverflow.com/questions/9670363/how-do-i-programmatically-configure-jersey-to-use-jackson-for-json-deserializa 
     final PackagesResourceConfig prc = new PackagesResourceConfig("com.ultimatefoodfight.server.api"); 
     final Map<String, Object> prcProperties = prc.getProperties(); 
     prcProperties.put(JSONConfiguration.FEATURE_POJO_MAPPING, true); 

     // from http://stackoverflow.com/questions/7421574/embedded-jetty-with-jersey-or-resteasy 
     contextHandler.addServlet(new ServletHolder(new ServletContainer(prc)), "/*"); 

     server.start(); 
     server.join(); 
    } 
    catch(Exception e) 
    { 
     System.out.println(e); 
    } 
} 

(當嵌入Jetty,這需要一個web.xml的地方。)com.sun.jersey。 api.core.PackagesResourceConfig掃描指定的類來獲取根資源提供程序類 - 我確定web.xml只是指向相同的。這在Eclipse中運行良好。服務器啓動時正確地報告這在控制檯:

INFO: Scanning for root resource and provider classes in the packages: 
    com.ultimatefoodfight.server.api 
Jul 29, 2012 7:31:28 AM com.sun.jersey.api.core.ScanningResourceConfig logClasses 
INFO: Root resource classes found: 
    class com.ultimatefoodfight.server.api.Users 
    class com.ultimatefoodfight.server.api.Contests 

然而,當我啓動服務器上的應用程序,我只得到了前兩行,並沒有根資源類中找到。

事實證明,當你製作一個罐子時,它有多種構造方式;特別是,如果您只是通過列出類的路徑進行創建,那麼您只會獲得 這些條目。但是,如果你用通配符將jar指向目錄,你也可以獲得所有的中間路徑。看到這個消息的例子,打倒了我:https://groups.google.com/d/msg/neo4j/0dNqGXvEbNg/xaNlRiU1cHMJ

PackagesResourceConfig類依賴於具有包名稱的目錄以查找其中的類。我回到Eclipse,並在「添加目錄條目」的「導出...> Jar」對話框的底部找到了一個選項。我打開它,再次導出了jar,然後掃描發現我的資源類。您需要在構建環境中找到一些可比較的選項。

+0

嘿克里斯!非常感謝您的帖子。我對運動衫感到厭倦,因爲它有時會用來檢測我的根源,有時它根本沒有。我不知道問題是什麼,你的文章指出了確切的問題,並幫助我解決問題。再次感謝! – Drona 2013-02-25 15:56:59

11

我有相同的錯誤信息,並通過修改我的web.xml文件來解決它。確保它有這個:

<init-param> 
    <param-name>com.sun.jersey.config.property.packages</param-name> 
    <param-value>your.package.name.here</param-value> 
</init-param> 
+0

甚至沒有在我的web.xml中添加此之後,工作對我來說...,錯誤仍然存​​在 – 2013-02-28 20:44:56

3

我剛剛花了5或6個小時的摔跤,並最終解決了問題。這可能也適用於你。

我一直在使用的源代碼可在Lars Vogel's tutorial page。使用Apache Tomcat 6.0.20,asm-all-3.3.1.jar,jersey-bundle-1.17.1.jar和jsr311-api-1.1.1。罐子我得到了相同的結果OP,即

INFO: Root resource classes found: 
    class com.mypackage.MyClass 
13/03/2013 4:32:30 PM com.sun.jersey.api.core.ScanningResourceConfig init 
INFO: No provider classes found. 

我已經跨越各種部署文件進行如下設置:

context root = rivets 
<url-pattern>/rest</url-pattern> 
@Path("/hello") 

嘗試使用以下URL訪問該資源給了一個404錯誤

http://localhost:8080/rivets/rest/hello 

最終能夠通過改變URL模式來解決它:

<url-pattern>/rest/*</url-pattern> 

儘管我不確定當我開始引入更復雜的資源時,這將如何成立。無論如何,希望這可能有助於某人。

0

我有同樣的問題。通過在web.xml中修改init-param標籤下的參數值來解決它。 默認情況下,Eclipse已在web.xml中將項目名稱設置爲display-name。這不應該被複制到參數值,而是Java包。

<init-param> 
    <param-name>com.sun.jersey.config.property.packages</param-name> 
    <param-value>com.test.demo</param-value> 
    </init-param> 

希望這會有所幫助。

0

要解決此問題,請確認您的類MapperIn,有指定路徑所需:

import javax.ws.rs.GET; 
import javax.ws.rs.OPTIONS; 
import javax.ws.rs.Path; 
import javax.ws.rs.PathParam; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.MediaType; 

import com.lot.account.api.doc.GetMemberAccountsIn; 
import com.lot.common.doc.CommonApi; 
import com.lot.common.doc.FlowData; 
import com.lot.security.authorization.RequestData; 


@Path("/account/member/") 
public class MapperIn { 

    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    @Path("/{memberId}") 
    public GetAccountIn prepareGetAccount(@PathParam("memberId") String memberId) { 

     // create apiInput 
     GetAccountIn apiInput = new GetAccountIn(); 

     // map values from url 
      apiInput.setMemberId(memberId); 


     return apiInput; 
    } 
//... 
} 
1

所以我讀槽的答案,仍然有同樣的問題。我解決它如下。

將「jetty-web.xml」添加到「WEB-INF」文件夾中。因此: 的src /主/ web應用/ WEB-INF /碼頭-web.xml中

碼頭-web.xml中的內容是:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!DOCTYPE Configure PUBLIC "-" "http://www.eclipse.org/jetty/configure.dtd"> 
<Configure class="org.eclipse.jetty.webapp.WebAppContext"> 
    <Set name="contextPath">/YourEndpoint</Set> 
</Configure> 

我休息現已在:

http://localhost:8080/YourEndpoint/webresources/someMethod 

希望這可以幫助那裏的人。

+0

這是因爲我忘了defing在web.xml – 2016-05-22 13:42:24

+0

端點<的context-param> \t \t​​resteasy.servlet .mapping.prefix \t \t /rest \t 2016-05-22 13:42:31

相關問題