RestAPI同时支持Multipart上传和JSON请求报RESTEASY003200错误如何解决
问题原因
你遇到的报错是因为MultipartFormDataInput类型的参数仅支持multipart/form-data类型的请求解析,你在@Consumes中配置了通配符*/*,当普通JSON请求(content-type为application/json)进入时,框架会尝试用Multipart对应的消息体读取器解析JSON内容,自然无法找到匹配的读取器,抛出对应异常。
修复方案
- 第一步:将
@Consumes的通配符替换为明确支持的两种媒体类型,避免不必要的类型匹配:
@Consumes({MediaType.APPLICATION_JSON, MediaType.MULTIPART_FORM_DATA})
- 第二步:不要将
MultipartFormDataInput直接声明为接口方法参数,改为通过上下文对象手动判断请求类型后按需读取,避免框架强制对所有请求做Multipart解析:
@PUT @Path("/symlink") @Consumes({MediaType.APPLICATION_JSON, MediaType.MULTIPART_FORM_DATA}) @Produces(value = MediaType.APPLICATION_JSON) public Response generateDateRefreshSymlinks( // 普通JSON请求的请求体,按自己的业务定义对应的DTO类型,非必传 @RequestBody(required = false) YourCustomJsonDTO jsonBody, @QueryParam("jobId") String jobId, // 注入请求上下文 @Context HttpServletRequest request ) throws IOException { MultipartFormDataInput inputFile = null; // 先判断是否是文件上传请求 if (ServletFileUpload.isMultipartContent(request)) { // 手动解析Multipart内容 inputFile = new MultipartFormDataInputImpl( request.getInputStream(), MediaType.valueOf(request.getContentType()) ); // 这里补充获取上传文件的逻辑,比如inputFile.getFormDataMap().get("file") } // 后续业务逻辑:根据inputFile是否为空区分是文件上传请求还是普通JSON请求 if (inputFile != null) { // 处理文件上传逻辑 } else { // 处理普通JSON请求逻辑 } }
补充说明
如果不需要强制同一个端点兼容两种请求,也可以直接拆分两个接口路径分别处理文件上传和JSON请求,代码逻辑会更简洁,维护成本更低。
内容的提问来源于stack exchange,提问作者anurag1007
相关产品推荐
相关产品推荐

