Java使用Jersey REST API客户端上传文件出现MessageBodyWriter找不到异常
异常排查与解决方案
根因分析
- 核心错误:Jersey客户端未正确注册multipart序列化组件。当前代码中客户端初始化时注册的是
MultiPart.class,但处理multipart/form-data类型的序列化/反序列化,需要注册的是MultiPartFeature.class,这是触发MessageBodyWriter not found异常的直接原因。 - 次要问题:客户端请求路径与服务端接口路径不匹配。服务端接口配置的路径为
/upload/pdf,而客户端当前请求地址为/repositories/file/upload,缺少路径后缀/pdf,序列化问题修复后会触发404错误。 - 潜在问题:若项目未引入
jersey-media-multipart依赖,也会触发该异常。
修复步骤
- 修正客户端组件注册逻辑
将原客户端初始化代码:
Client client = ClientBuilder.newClient().register(MultiPart.class);
修改为:
Client client = ClientBuilder.newClient().register(MultiPartFeature.class);
原有未调用的configureClient方法可直接删除,无需保留。
- 修正请求路径
调整客户端请求地址,补全服务端接口的路径后缀。若服务端项目上下文根为/repositories/file,则请求地址修改为:
WebTarget server = client.target("http://localhost:8080/repositories/file/upload/pdf");
- 确认依赖引入
以Maven为例,检查pom.xml中是否引入了版本匹配的multipart依赖,版本需与项目使用的Jersey核心版本保持一致:
<dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-multipart</artifactId> <version>你的Jersey版本号</version> </dependency>
修正后可运行的客户端核心代码
public static void main(String[] args) { Client client = ClientBuilder.newClient().register(MultiPartFeature.class); WebTarget server = client.target("http://localhost:8080/repositories/file/upload/pdf"); FileDataBodyPart filePart = new FileDataBodyPart("file", new File("C:\\Users\\kunal\\Downloads\\JWTUtility.java")); filePart.setContentDisposition(FormDataContentDisposition.name("file").fileName("JWTUtility.java").build()); MultiPart multipartEntity = new FormDataMultiPart().bodyPart(filePart); Response result = server.request().post(Entity.entity(multipartEntity, multipartEntity.getMediaType())); System.out.println(result.getStatus()); System.out.println(result.readEntity(String.class)); result.close(); }
内容的提问来源于stack exchange,提问作者Kunal Singh
相关产品推荐
相关产品推荐

