gpt4 book ai didi

spring-boot - PUT 方法中缺少 Spring Boot MultipartResolver

转载 作者:行者123 更新时间:2023-12-03 14:04:48 31 4
gpt4 key购买 nike

我正在使用 Spring 创建一个 REST 服务并得到一个异常告诉我以下内容。

Expected MultipartHttpServletRequest: is a MultipartResolver configured?



当我将 method=RequestMethod.PUT 更改为 method=RequestMethod.POST 时,它正在工作。

为什么我在 PUT 上得到这个异常而不在 POST 上得到这个异常?
@Configuration
@ComponentScan("io.myservice")
@EnableAutoConfiguration
@EnableCaching
@EnableAsync(mode = ASPECTJ)
public class Application implements AsyncConfigurer {

static org.slf4j.Logger LOG = LoggerFactory.getLogger(Application.class);

public static final String MAX_FILE_SIZE = "2MB";
public static final String MAX_REQUEST_SIZE = "2MB";
public static final String FILE_SIZE_THRESHOLD = "2MB";

@Value("${app.dir.incoming}")
public String createdDir;

@Bean
public LocalValidatorFactoryBean localValidatorFactoryBean() {
return new LocalValidatorFactoryBean();
}

@Bean
MultipartConfigElement multipartConfigElement() {
String absTempPath = new File(createdDir).getAbsolutePath();
MultipartConfigFactory factory = new MultipartConfigFactory();
factory.setMaxFileSize(MAX_FILE_SIZE);
factory.setMaxRequestSize(MAX_REQUEST_SIZE);
factory.setFileSizeThreshold(FILE_SIZE_THRESHOLD);
factory.setLocation(absTempPath);
return factory.createMultipartConfig();
}

@Bean
public StandardServletMultipartResolver multipartResolver() {
return new StandardServletMultipartResolver();
}

@Override
@Bean
public ThreadPoolTaskExecutor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(2);
executor.setMaxPoolSize(2);
executor.setQueueCapacity(5);
executor.initialize();
return executor;
}

@Bean
public SimpleCacheManager cacheManager(){
SimpleCacheManager cacheManager = new SimpleCacheManager();
List<Cache> caches = new ArrayList<Cache>();
caches.add(cacheBean());
cacheManager.setCaches(caches );
return cacheManager;
}

@Bean
public Cache cacheBean(){
Cache cache = new ConcurrentMapCache("default");
return cache;
}

public static void main(String[] args) throws IOException {
SysOutOverSLF4J.sendSystemOutAndErrToSLF4J();
run(Application.class, args);
}
}


@RequestMapping(value="/converter", method=RequestMethod.PUT)
@ResponseBody
public String convert(MultipartFile file) {
LOG.info("received new file to convert")
}


Caused by: java.lang.IllegalArgumentException: Expected MultipartHttpServletRequest: is a MultipartResolver configured?
at org.springframework.util.Assert.notNull(Assert.java:112)
at org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.resolveName(RequestParamMethodArgumentResolver.java:171)
at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:89)
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:79)
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:157)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:124)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:689)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
... 37 common frames omitted

最佳答案

Spring 使用的多部分支持不支持其他请求方法,然后 POST .对于 StandardServletMultipartResolver 这是在该类中硬编码的。

对于 CommonsMultipartResolver 它被硬编码在 ServletFileUpload 中来自 Apache Commons Fileupload 的实用程序类项目。

Form-based File Upload in HTML (RFC1867)关于这一点并不是很明确,但唯一提到使用的 HTTP 方法是 POST。

简而言之,目前框架只支持 POST,您可以通过重新实现一些类来解决它,但如果它有效(尤其是使用默认的 Servlet 3.0 文件上传支持)可能取决于您的容器。

关于spring-boot - PUT 方法中缺少 Spring Boot MultipartResolver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25632836/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com