WildFly25标注@MultipartConfig仍报UT010057 multipart配置不存在错误
错误产生原因
@MultipartConfig是Servlet规范定义的注解,仅能标注在直接继承HttpServlet的实现类上才会被Servlet容器(WildFly底层使用Undertow作为Servlet容器)识别生效。你将该注解标注在JAX-RS资源类、继承Application的激活类上没有任何作用,这两类都不属于Servlet实现类,WildFly自动注册的RESTEasy分发Servlet(HttpServletDispatcher)无法读取到该配置,因此Undertow在校验multipart请求时直接抛出UT010057错误。
排查解决方法
可任选以下任意一种方案解决问题:
- 方案1:通过
web.xml配置Multipart参数(最稳妥通用)
在项目WEB-INF目录下新增/修改web.xml,给WildFly默认注册的JAX-RS Servlet添加multipart配置:<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd" version="5.0"> <servlet> <servlet-name>javax.ws.rs.core.Application</servlet-name> <multipart-config> <!-- 单文件最大大小,单位字节,以下示例为10MB --> <max-file-size>10485760</max-file-size> <!-- 整个请求最大大小,单位字节,以下示例为20MB --> <max-request-size>20971520</max-request-size> <!-- 内存存储阈值,超过该值会写入磁盘,0为所有内容直接写磁盘 --> <file-size-threshold>0</file-size-threshold> </multipart-config> </servlet> </web-app> - 方案2:自定义RESTEasy入口Servlet,添加
@MultipartConfig注解
自己实现Servlet类替代默认的JAX-RS激活逻辑,直接在Servlet上添加注解:
配置后原import org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher; import javax.servlet.annotation.MultipartConfig; import javax.servlet.annotation.WebServlet; @WebServlet(urlPatterns = "/api/*") @MultipartConfig(maxFileSize = 10485760, maxRequestSize = 20971520) public class CustomResteasyServlet extends HttpServletDispatcher { }JaxRsActivator类可删除,或去掉类上的@ApplicationPath注解避免路径冲突。 - 方案3:使用RESTEasy原生Multipart支持(无需配置
@MultipartConfig)
不依赖Servlet的getParts()方法,直接用RESTEasy内置的multipart解析能力接收上传内容:import org.jboss.resteasy.plugins.providers.multipart.InputPart; import org.jboss.resteasy.plugins.providers.multipart.MultipartFormDataInput; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.core.Response; import java.io.InputStream; import java.util.List; @Path("/") public class File { @Path("/upload") @POST public Response upload(MultipartFormDataInput input) { // 从表单中获取name为file的上传文件列表 List<InputPart> fileParts = input.getFormDataMap().get("file"); for (InputPart part : fileParts) { // 直接获取文件流处理业务逻辑 InputStream fileStream = part.getBody(InputStream.class, null); } return Response.ok().build(); } }
内容的提问来源于stack exchange,提问作者Victor
相关产品推荐
相关产品推荐

