我是球衣和网络服务的新手,我尝试运行一个简单的RESTful Web服务。我跟着http://www.mkyong.com/webservices/jax-rs/jersey-hello-world-example/,但我的项目没有使用maven,我下载了jersey.1.17.1.jar并将其包含在我的项目路径中。
当我想在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 :(得分:27)
错误:
com.sun.jersey.api.container.ContainerException:ResourceConfig实例不包含任何根资源类。
表示Jersey无法找到服务类。这可能是由com.sun.jersey.config.property.packages
参数的错误命名包引起的,或者包名是否正确但是它不包含资源类(人们有时忘记在类上添加@Path
注释)。 / p>
但我发现你的设置没有任何问题。所以这应该有效!
检查您的应用程序是否已正确部署,并且您的WEB-INF/classes
文件夹实际上是否包含具有该软件包的正确文件夹路径的类。
完全清理并重建然后再试一次。
答案 1 :(得分:0)
我不是你面临的实际问题。 你可以下载一个例子https://github.com/kdmalviyan/RestWithJerseyExample.git 下载后你必须采取以下行动: 1. mvn clean install 2.将war部署到您的服务器 3.访问&#34; JerseyExample-0.0.1-SNAPSHOT / rest / hello / hello Kuldeep Singh&#34;在您的服务器上
你会得到如下的输出:泽西说:你好Kuldeep Singh
我建议您先按照确切的步骤进行任何更改。如果您得到正确的结果,那么您可以根据需要进行修改。请确保您是否重命名包,也在web.xml中重命名包。
答案 2 :(得分:0)
我刚刚使用Grizzly和球衣遇到了这个问题。
当您启动Grizzly容器时,您必须传递一张地图,告诉Grizzly在哪里可以找到您的资源。如果您像我一样从原型创建项目,或者只是移动了一些东西,那么您还必须更新这个容易被忽视的值。
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);
答案 3 :(得分:0)
我也遇到了这个问题。为了让它发挥作用,我做了两件事,第一件事与这个问题无关。
首先,我正在使用球衣1.19。但是,我没有意识到有一个名为的文件
服务器上javax.ws.rs-api-2.0.jar
中的WEB-INF/lib
。这个文件是在两年前添加的,IIRC与jersey 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文件。
答案 4 :(得分:0)
我遇到类似的问题。请检查您的初始化过程是否已正确注册api类。
在您的情况下,初始化类是ir.sycotech.text.server.service
您需要在服务中注册所有api类。
以下是我的例子:
如果未注册以下类,我将遇到错误,(register(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!*****");
}
}
答案 5 :(得分:0)
请确保您的软件包“com.sun.jersey.config.property.packages”在Web.xml中正确注册...祝您好运!
request.getParameter("action")=="delete"
答案 6 :(得分:0)
如果您尝试使用HttpServerFactory,则必须传递PackagesResourceConfig。
示例:
ResourceConfig rc = new PackagesResourceConfig("com.package");
HttpServerFactory.create(getBaseURI(), rc);
答案 7 :(得分:0)
我遇到了同样的问题,我通过指定类包和完全删除 load-on-startup 解决了这个问题,即:
public abstract class BaseNotificationHandlerActivity extends AppCompatActivity {
protected int activityFlag = 0; // set a unique value from each extending Activity
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onStart(){
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(NotificationItem notif) {
if(activityFlag == 1){
// this means Starting Activity, so handle for it particularly
NotificationHelper notifHelper = new NotificationHelper(this);
notifHelper.AddNotificationItem(notif);
}
else if(activityFlag ==2){
// for some other Activity
}
}
}
public class StartingActivity extends BaseNotificationHandlerActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_starting);
activityFlag = 1; // add unique flag for Activity here
}
@Override
public void onResume() {
super.onResume();
}
我想是因为我在同一个软件包下有多个servlet而且Jersey coudn没有选择&#34; root&#34;一个在启动时加载。
答案 8 :(得分:0)
嗯,以上答案都不适合我。不过,他们让我仔细检查每一步和包名。正如Bogdan所说,target/classes/
文件夹中没有编译过的类。
检查您的应用程序是否正确部署,以及您的WEB-INF / classes文件夹实际上是否包含具有该软件包的正确文件夹路径的类。
我的解决方案只是清理项目并编译不同的内容。我没有去mvn war:war
,而是去了:
$ mvn clean:clean
$ mvn compile
$ mvn war:war
然后编译得很好,OP错误就消失了。