WildFly 34(Jakarta EE 10)JAX-RS多部分表单文件上传报错咨询
解决方案:WildFly 34中JAX-RS文件上传避免MultipartConfig配置问题
问题原因
OpenLiberty会自动为处理multipart/form-data的JAX-RS端点添加Servlet的MultipartConfig配置,而WildFly 34的Undertow容器默认要求显式配置该参数,因此直接使用Servlet API(如request.getParts())或非标准JAX-RS参数注解处理文件上传时会抛出UT010057: multipart config was not present on Servlet异常。
方案一:使用JAX-RS标准Multipart API(可移植,最小代码修改)
改用JAX-RS规范定义的@FormDataParam注解替代Servlet API或@FormParam,这是跨容器的可移植方案,无需依赖Servlet的MultipartConfig配置。
修改后的代码示例
第一个接口修改为:
@POST @Path("/upload") @Consumes(MediaType.MULTIPART_FORM_DATA) public void uploadFiles(@FormDataParam("files") List<FormDataBodyPart> fileParts, @Suspended final AsyncResponse asyncResponse) { // 处理文件部件,示例:获取文件输入流 for (FormDataBodyPart part : fileParts) { InputStream fileStream = part.getEntityAs(InputStream.class); // 后续处理逻辑 } }
第二个接口修改为:
@POST @Path("/upload") @Consumes(MediaType.MULTIPART_FORM_DATA) public void uploadFile(@FormDataParam("fileName") final String fileName, @FormDataParam("file") final InputStream inputStream, @Suspended final AsyncResponse asyncResponse) { // 原有处理逻辑保持不变 }
方案二:无需修改Java源码的WildFly配置方案
如果希望完全保留原有代码,可通过配置文件为JAX-RS自动生成的Servlet添加MultipartConfig:
方式1:通过web.xml配置
在WEB-INF/web.xml中显式配置JAX-RS对应的Servlet并添加MultipartConfig:
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <!-- 对应JAX-RS自动注册的Servlet名称 --> <servlet-name>javax.ws.rs.core.Application</servlet-name> <multipart-config> <!-- 可根据需求调整参数,以下为默认值 --> <location></location> <max-file-size>-1</max-file-size> <max-request-size>-1</max-request-size> <file-size-threshold>0</file-size-threshold> </multipart-config> </servlet> </web-app>
方式2:通过jboss-web.xml配置
若应用未使用web.xml,可在WEB-INF/jboss-web.xml中添加配置:
<jboss-web xmlns="http://www.jboss.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee http://www.jboss.org/j2ee/schema/jboss-web_10_0.xsd" version="10.0"> <servlet> <servlet-name>javax.ws.rs.core.Application</servlet-name> <multipart-config> <location></location> <max-file-size>-1</max-file-size> <max-request-size>-1</max-request-size> <file-size-threshold>0</file-size-threshold> </multipart-config> </servlet> </jboss-web>
配置完成后,WildFly会自动为JAX-RS Servlet应用MultipartConfig,原有代码即可正常运行。
内容的提问来源于stack exchange,提问作者dabbabi
相关产品推荐
相关产品推荐

