use*_*646 20 java jax-rs jersey
虽然这是一个古老的问题,但我仍然找不到能够做到这一点的答案.如果您发现我的任何陈述不正确,请更正.
我有一个Java Face应用程序并使用REST作为Web服务.我不认为Face与我的问题有任何关系.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>
Run Code Online (Sandbox Code Playgroud)
我在web.xml中有更多的servlet,因为它是一个与Trinidad等的Face应用程序.
在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";
}
}
Run Code Online (Sandbox Code Playgroud)
我的类有一个@GET的事实足以将自己标识为资源类.
更别说所有其他复杂性了,我在Eclipse中用Ant编译了我的源代码,我在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.
Run Code Online (Sandbox Code Playgroud)
有人建议将asm.jar,jsr-api.jar,jersey-server.jar和jersey-core.jar复制到app WEB-INF/lib中.我这样做了,但仍然无效.我发现这个建议有点奇怪,因为WEB-INF/lib是Eclipse将从构建路径安装所有依赖库的地方.它不是我们手动放置库的地方.
有人解释说这个错误与Java插件和Jersey编写方式有关.但那是几年前的事了.
有人可以向我解释为什么我一直有这个问题吗?
后续:虽然从REST Web站点,定义为Root资源类的资源类是POJO(普通旧Java对象),它们使用@Path注释或至少有一个使用@Path注释的方法或请求方法指示符(如@GET), @ PUT,@ POST或@DELETE.资源方法是使用请求方法指示符注释的资源类的方法.本节介绍如何使用Jersey注释Java对象以创建RESTful Web服务.
我必须将@Path("/ hello")添加到我的类中,突然Jersey可以找到我的资源类
现在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'
Run Code Online (Sandbox Code Playgroud)
但问题远未结束.我尝试访问URL http://localhost:8080/nd/hello
,我仍然得到404 NOT FOUND.Provider类找不到重要的消息吗?
Con*_*der 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>
Run Code Online (Sandbox Code Playgroud)
小智 7
我发现泽西岛无法找到根资源的另一个原因.错误信息是相同的,所以我认为这是一个很好的理由来记录这里的根本原因,以防其他人偶然发现它.
我有一个根资源类,其上有以下注释:
@Singleton
@Path("/helloWorld")
@Service(...) // my own custom annotation
public class MyRootResource {
...
}
Run Code Online (Sandbox Code Playgroud)
这将导致Jersey内的根资源扫描失败.
修复方法是更改注释的顺序:
@Service(...) // my own custom annotation
@Singleton
@Path("/helloWorld")
public class MyRootResource {
...
}
Run Code Online (Sandbox Code Playgroud)
这有效.
首先,请注意,在类上使用@GET不足以将其标识为根资源类; 该类必须有一个@Path.你的确如此,所以这不是问题所在.
我遇到了和你一样的问题:它在Eclipse中运行,但是当我为外部使用而构建它时却没有用.
我正在使用嵌入式Jetty,其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);
}
}
Run Code Online (Sandbox Code Playgroud)
(当嵌入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
Run Code Online (Sandbox Code Playgroud)
但是,当我在服务器上启动应用程序时,我只获得前两行,并且没有找到Root资源类.
事实证明,当你制作一个罐子时,它的构造方式有不同的选择; 特别是,如果您只是通过列出类的路径来实现它,那么您只需获得这些条目.但是,如果您使用通配符将jar指向目录,则还会获得所有中间路径.请参阅此消息,了解有关我的示例:https://groups.google.com/d/msg/neo4j/0dNqGXvEbNg/xaNlRiU1cHMJ.
PackagesResourceConfig类依赖于具有包名称的目录,以便在其中查找类.我回到了Eclipse,在"Export ...> Jar"对话框的底部找到了"添加目录条目"的选项.我打开它,再次导出jar,然后扫描找到我的资源类.您需要在构建环境中找到一些类似的选项.
归档时间: |
|
查看次数: |
77015 次 |
最近记录: |