2011-05-24 81 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

相关问题