没有处理器声明任何这些注释:javax.servlet.annotation.MultipartConfig
Posted
技术标签:
【中文标题】没有处理器声明任何这些注释:javax.servlet.annotation.MultipartConfig【英文标题】:No processor claimed any of these annotations: javax.servlet.annotation.MultipartConfig 【发布时间】:2017-06-16 03:43:16 【问题描述】:为什么 MultipartConfig 注释处理器不在带注释的类上工作?当我使用 Gradle 构建我的 Java 项目时,我收到以下警告:
没有处理器声明任何这些注释:javax.servlet.annotation.MultipartConfig,javax.servlet.annotation.WebServlet
当我从我得到的表单向那个 servlet 发送文件时
HTTP ERROR 500
Problem accessing /historyUpload/upload. Reason:
Server Error
Caused by:
java.lang.IllegalStateException: No multipart config for servlet
at org.eclipse.jetty.server.Request.getParts(Request.java:2303)
at org.eclipse.jetty.server.Request.getParts(Request.java:2290)
at org.eclipse.jetty.server.Request.getPart(Request.java:2279)
at javax.servlet.http.HttpServletRequestWrapper.getPart(HttpServletRequestWrapper.java:386)
at com.mycom.UploadServlet.doPost(UploadServlet.java:32)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
[...]
但是我的 build.gradle 中有 javax.servlet-api-3.1.0.jar - 我的项目模块包括其他几个 HttpServlet 类,它们可以针对它构建和执行 OK。该 JAR 确实包含 javax.servlet.annotation.MultipartConfig 。
上传Servlet.java:
package com.mycom.uploadservlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
@SuppressWarnings("serial")
@MultipartConfig(location="/tmp/upload", fileSizeThreshold=1024*1024, maxFileSize=1024*1024*50)
public class UploadServlet extends HttpServlet
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
resp.setContentType("text/plain");
PrintWriter out = resp.getWriter();
out.printf("Got part: name=%s, size=%d%n",req.getPart("file").getName(), req.getPart("file").getSize());
int i=0;
for(Part part: req.getParts())
out.printf("Got part: name=%s, size=%d%n",part.getName(), part.getSize());
part.write(String.format("part-%02d.dat",i++));
【问题讨论】:
【参考方案1】:问题是我在web.xml
中定义了一个<servlet>
配置,它覆盖了class UploadServlet
上的@WebServlet()
注释。我没有使用@WebServlet
注释,因为我在web.xml
中有<servlet>
配置。但是这种覆盖也会覆盖class UploadServlet
上的任何@MultipartConfig 注释,即使<servlet>
块中没有包含<multipart-config>
块。因此,要处理enctype="multipart/form-data"
的形式,web.xml
中的<servlet>
块必须包含<multipart-config>
块,或者web.xml
中没有<servlet>
块,而是用@MultipartConfig()
注释类(等等@WebServlet
)。
<servlet>
<servlet-name>UploadServlet</servlet-name>
<servlet-class>com.mycom.UploadServlet</servlet-class>
<multipart-config>
<max-file-size>10485760</max-file-size>
<max-request-size>20971520</max-request-size>
<file-size-threshold>5242880</file-size-threshold>
</multipart-config>
</servlet>
【讨论】:
以上是关于没有处理器声明任何这些注释:javax.servlet.annotation.MultipartConfig的主要内容,如果未能解决你的问题,请参考以下文章
java.lang.ClassCastException: cn.itcase.serviceImpl.servicestudentImpl cannot be cast to javax.servl