当前位置: 首页 > 知识库问答 >
问题:

无法处理零件,因为未提供多零件配置

充阳秋
2023-03-14

我写了一个简单的控制器来上传文件:

@RestEndpoint
public class ImageController {
    @Autowired
    GridFsTemplate mTemplate;

    @RequestMapping(value = "images", method = RequestMethod.POST)
    public @ResponseBody String testPhoto(@RequestParam String name, @RequestParam String directory, @RequestParam MultipartFile file) throws IOException {

        if(!file.isEmpty()){
            final byte[] bytes = file.getBytes();
            InputStream inputStream = new ByteArrayInputStream(bytes);
            mTemplate.store(inputStream, "name");

            return "uploaded photo";
        }

        return "failed";
    }

} 

@RestEndpoint注释是:

@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
public @interface RestEndpoint
{
    String value() default "";
}

我的ContextCOnfiguration类是:

@Configuration
@EnableWebMvc
@ComponentScan(
    basePackages = "com.questter.site",
    useDefaultFilters = false,
    includeFilters =
    @ComponentScan.Filter({RestEndpoint.class, RestEndpointAdvice.class})
)
public class RestServletContextConfiguration extends WebMvcConfigurerAdapter {
    @Bean
    public CommonsMultipartResolver multiPartResolver(){

        CommonsMultipartResolver resolver = new CommonsMultipartResolver();
        return resolver;
    }
...
}

已更新

web。xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<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_3_1.xsd"
     version="3.1">

    <display-name>Spring Application</display-name>

    <jsp-config>
        <jsp-property-group>
            <url-pattern>*.jsp</url-pattern>
            <url-pattern>*.jspf</url-pattern>
            <page-encoding>UTF-8</page-encoding>
            <scripting-invalid>true</scripting-invalid>
            <include-prelude>/WEB-INF/jsp/base.jspf</include-prelude>
            <trim-directive-whitespaces>true</trim-directive-whitespaces>
            <default-content-type>text/html</default-content-type>
        </jsp-property-group>
    </jsp-config>

    <!--<context-param>-->
        <!--<param-name>spring.profiles.active</param-name>-->
        <!--<param-value>development</param-value>-->
    <!--</context-param>-->

    <session-config>
        <session-timeout>30</session-timeout>
        <cookie-config>
            <http-only>true</http-only>
        </cookie-config>
        <tracking-mode>COOKIE</tracking-mode>
    </session-config>

    <distributable />

</web-app>

-已更新-

public class Bootstrap implements WebApplicationInitializer
{

    @Override
    public void onStartup(ServletContext container) throws ServletException
    {
        container.getServletRegistration("default").addMapping("/resource/*");

        AnnotationConfigWebApplicationContext rootContext =
            new AnnotationConfigWebApplicationContext();
        rootContext.register(RootContextConfiguration.class);
        container.addListener(new ContextLoaderListener(rootContext));

        AnnotationConfigWebApplicationContext webContext =
            new AnnotationConfigWebApplicationContext();
        webContext.register(WebServletContextConfiguration.class);
        ServletRegistration.Dynamic dispatcher = container.addServlet(
            "springWebDispatcher", new DispatcherServlet(webContext)
        );
        dispatcher.setLoadOnStartup(1);
        dispatcher.setMultipartConfig(new MultipartConfigElement(
            null, 20_971_520L, 41_943_040L, 512_000
        ));
        dispatcher.addMapping("/");

        AnnotationConfigWebApplicationContext restContext =
                new AnnotationConfigWebApplicationContext();
        restContext.register(RestServletContextConfiguration.class);
        DispatcherServlet servlet = new DispatcherServlet(restContext);
        servlet.setDispatchOptionsRequest(true);
        dispatcher = container.addServlet(
                "springRestDispatcher", servlet
        );
        dispatcher.setLoadOnStartup(2);
        dispatcher.addMapping("/rest/*");

        rootContext.refresh();
        DbBootstrap dbBootstrap = rootContext.getBean(DbBootstrap.class);
        dbBootstrap.init();

    }


}

当执行post请求(使用postman)时,我得到:

HTTP Status 500 - Request processing failed; nested exception is java.lang.IllegalArgumentException:Expected MultipartHttpServletRequest: is a MultipartResolver configured 

我已经在stackoverflow上查看了一些类似的问题,但没有一个答案对我有帮助。

Spring版本为:4.0.4

任何帮助将不胜感激(当然要竖起大拇指)。

谢谢

共有3个答案

孟彦
2023-03-14

除了没有发现多部件配置之外,这一点很简单。尽管您已经提供了multipartResolver bean。

问题是,在Spring Security过滤器之前指定MultipartFilter时,它试图获取multipartResolver bean,但找不到它。因为它要求bean名称/id为filterMultipartResolver,而不是MultipartResolver。

帮你自己一个忙。请更改bean配置,如下所示-

@Bean
public CommonsMultipartResolver filterMultipartResolver(){
    CommonsMultipartResolver resolver = new 
    CommonsMultipartResolver();
    return resolver;
}

@Bean(name = "filterMultipartResolver")
public CommonsMultipartResolver multiPartResolver(){
    CommonsMultipartResolver resolver = new 
    CommonsMultipartResolver();
    return resolver;
}
卢伟志
2023-03-14
allowCasualMultipartParsing="true"

context.xml内的上下文标签,这是我的工作

邴修远
2023-03-14

我不知道他们为什么这样做,但是上下文中的MultipartResolverbean需要命名为multipartResolver。将您的@Bean方法重命名为

public CommonsMultipartResolver multipartResolver(){ // lowercase 'P'

或者明确地给它起个名字

@Bean(name = "multipartResolver")
public CommonsMultipartResolver canBeCalledAnything(){
 类似资料:
  • 我想使用火花从html表单上传文件。以下是我的java函数来处理帖子路由: 以下是超文本标记语言形式: 当我上传文件时,我收到500:内部服务器错误,具有以下堆栈跟踪: 遵循以下问题,但答案不起作用:SparkJava:上传文件在Spark java框架中不起作用 我正在使用eclipse IDE和tomcat服务器。 请帮我解决这个问题。

  • 因此,我是Spring的新手,我正在尝试让文件上传为我的项目工作(顺便说一句,我正在使用Spring工具套件),提交表单时,我得到的只是: HTTP状态500-无法解析多部分servlet请求;嵌套异常为java。lang.IllegalStateException:无法处理部件,因为未提供多部件配置 从浏览器堆栈跟踪: 这是jsp中的表单标记: 输入部分: 照片存储在此字段中的艺术家对象: 控制

  • 我有一个工作的Spring-boot mvc应用程序,我正在尝试集成文件上传选项。根据手册,我配置了以下模板: /src/main/resource/templates/file upload . html 当我登录,然后调用http:/ 127.0.0.5:8080 /上传表单显示时,但当我点击提交按钮时,我得到了。错误消息 HTTP状态403-在请求参数“_csrf”或标头“X-CSRF-TO

  • 我注意到这里的多部分请求有一个奇怪的问题。 下面是Spring Boot 2.4.2中使用的球衣2实现: 并遵循 Spring Boot 依赖项: 我能够使用Postman成功上传JSON和文件(作为多部分/表单数据),但是来自Java客户端的相同请求抛出以下错误: 这篇关于SO的文章说我们需要添加一个< code > CommonsMultipartResolver ,但是为什么它在Postma

  • 这件事我快发疯了。我以前用过自动完成的方法,效果很好。例如:https://maps.googleapis.com/maps/api/place/autocomplete/json?sensor=false 现在我试图在1000米范围内的用户位置上使用搜索,但我一直没有得到任何结果。有人能看到我看不到的吗? https://maps.googleapis.com/maps/api/place/se

  • 我正在处理UDF中的空值,该UDF在数据帧(源自配置单元表)上运行,该数据帧由浮点数结构组成: 数据帧()具有以下架构: 例如,我想计算x和y的总和。请注意,我不会在以下示例中“处理”空值,但我希望能够在我的udf中检查、或是否。 第一种方法: 如果<code>struct是否为空,因为在scala中<code>浮点不能为空。 第二种方法: 这种方法,我可以在我的udf中检查是否为空,但我可以检查