没有处理器声明任何这些注释: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

没有处理器声称这些注释中的任何一个

JSP内置对象

JSP内置对象

必须立即显式声明注释处理器

Java Annotation注释机制