我正在使用Jersy来开发REST webservices,这是我的简单代码:
@GET
@Path("/retrieveCustomerInformation/{jsonString}")
@Produces(MediaType.APPLICATION_JSON)
public String retrieveCustomerInformation(@PathParam("jsonString")JSONObject jsonObject)
throws Exception {
//Other codes here
}
但是当我从浏览器ping其余的服务URL时,我得到的是异常:
javax.servlet.ServletException: Servlet.init() for servlet jersey-serlvet threw exception
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
,根本原因是:
com.sun.jersey.spi.inject.Errors$ErrorMessagesException
com.sun.jersey.spi.inject.Errors.processErrorMessages(Errors.java:170)
com.sun.jersey.spi.inject.Errors.postProcess(Errors.java:136)
com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:199)
有人可以指导我,导致此错误的原因是什么?我发现很难理解这个错误消息,因为它没有提供任何有用的信息来调试。
这是我的web.xml
<servlet>
<servlet-name>jersey-serlvet</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.test/param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jersey-serlvet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
我正在使用Jersey 1.8,JDK 1.7和App在Tomcat 7.0上运行。如果需要,我可以提供更多信息。
答案 0 :(得分:3)
您的问题似乎是重复的,可能已得到适当解决。我前段时间也遇到过同样的问题。 Click here to see the accepted answer that resolved it for me
如果您不愿意关注该链接,请首先尝试将 jersey-multipart.jar
和 mimepull.jar
添加到您的项目库中...如果您的项目是Maven项目,请将以下依赖项添加到pom.xml
。 mimepull
依赖项应与其一起发布。的 强>
<dependency>
<groupId>com.sun.jersey.contribs</groupId>
<artifactId>jersey-multipart</artifactId>
<version>1.8</version>
</dependency>
强> <强> 强>
请务必确保您使用的 jersey-multipart
版本与您的 jersey
版本相同'在项目中使用。
如果以上解决方案无法解决您的问题,您可能还希望看到 here 以获取更多有用的提示。干杯!
答案 1 :(得分:3)
检查是否存在冲突@Path注释。 这将导致相同的错误。传递路径问题是一个奇怪的错误,但您可以通过重命名匹配路径轻松测试它。
以下代码中兑现路径的示例
某些课程
@Path("/storage")
public class BookingRestService {
@GET
@Path("/bookings")
@Produces(value = MediaType.APPLICATION_XML)
和另一个班级
@Path("/storage")
public class StorageRestService {
通过重命名任何@Path("/storage")
问题,会影响您的工作进度。
答案 2 :(得分:0)
从参考
添加依赖项Jersey Application Deployment and Runtime Environments
<servlet>
<servlet-name>jersey-serlvet</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.rest.portal</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.scanning.recursive</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>com.rest.portal.HelloWord</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jersey-serlvet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
仅在Jersey 1.x中使用
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
在2.x系列中使用
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
并添加必要的jersy jar文件
答案 3 :(得分:0)
另一个用例,它会导致同样的异常,这会破坏我的代码。 如果您要编写这样的资源:
#include <list>
#include <iostream>
using namespace std;
#define foreach(a,b,c,d) for(a; b; c)if(d)
int main(){
list<int> a;
for(int i=0; i<10; i++)
a.push_back(i);
for(auto i=a.begin(); i!=a.end(); i++)
if((*i)&1)
cout << *i << ' ';
cout << endl;
foreach(auto i=a.begin(), i!=a.end(), i++, (*i)&1)
cout << *i << ' ';
cout << endl;
return 0;
}
以下数据类型public String getPOST(@QueryParam("type") Character type){}
将导致异常。