Jersey RESTful 框架是开源的RESTful框架, 实现了 JAX-RS 规范。它扩展了JAX-RS 参考实现, 提供了更多的特性和工具, 可以进一步地简化 RESTful service 和 client 开发。这里主要记录下在使用jersey开发中遇到的问题及解决方案,供大家参考。
报错信息:The ResourceConfig instance does not contain any root resource classes。
原因:web.xml配置有问题,下图红框中要配置服务端的包路径上传文件
Jersey上传文件需要jersey-multipart-1.19.1.jar这个包,有时也需要mimepull.jar这个包,例如下面这个例子:
@POST
@Path("/upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public String fileUpload(@FormDataParam("file") InputStream fileInputStream,
@FormDataParam("file") FormDataContentDisposition disposition) throws IOException {
String imageName = Calendar.getInstance().getTimeInMillis()
+ disposition.getFileName();
// System.out.println(name);
File file = new File(ARTICLE_IMAGES_PATH + imageName);
//使用common io的文件写入操作
try {
OutputStream os = new FileOutputStream(file);
int bytesRead = 0;
byte[] buffer = new byte[8192];
while ((bytesRead = fileInputStream.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
fileInputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
//原来自己的文件写入操作
//saveFile(fileInputStream, file);
return "images/" + imageName;
}
可能会出现如下错误:
解决方案:
(1)在application注册MultiPartFeature类
(2) 在web.xml文件中添加如下代码
<servlet>
<servlet-name>Jersey-Service</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.css.sword.restful</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>org.glassfish.jersey.filter.LoggingFilter;org.glassfish.jersey.media.multipart.MultiPartFeature</param-value>
</init-param>
替换了2.23的包出现了如下的错误:
Caused by: java.lang.ClassNotFoundException: org.glassfish.jersey.server.internal.inject.AbstractHttpContextValueFactory
这个问题折腾了我好几天,最后找到主要的问题在jersey-media-multipart-2.0.jar 这个包上。
这个包主要来辅助文件上传的,不引用这个包如果只是简单的表单及请求操作,程序可以正常启动,如果想做文件上传需引用这个包,问题就出现了,后来看这个包的源码发现它的确需要AbstractHttpContextValueFactory
而2.23版本中没有这个版本,经过几天的研究,找到问题jersey2.1以上都去掉了这个类,可能jersey-media-multipart-2.0.jar(此外还试了jersey-media-multipart-2.2.jar这个包,也是一样的问题)没有及时更新,将jersey版本换成2.0,问题解决