首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Spring Boot的Jersey多部分配置

使用Spring Boot的Jersey多部分配置
EN

Stack Overflow用户
提问于 2018-05-31 23:50:56
回答 1查看 2K关注 0票数 1

我在尝试解析包含多部分文件的HttpServletRequest时遇到问题。我已经尝试了关于我面临的异常的其他帖子的所有解决方案,但似乎都不起作用。

以下是项目的相关依赖项:

代码语言:javascript
复制
<project>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.13.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jersey</artifactId>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-multipart</artifactId>
        <version>2.25.1</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3.3</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>
</build>

SpringBoot应用程序初始化器:

代码语言:javascript
复制
@SpringBootApplication
public class ApplicationBoot extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(ApplicationBoot.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(ApplicationBoot.class, args);
    }
}

Jersey初始化器配置和multipartResolver bean:

代码语言:javascript
复制
@Configuration
@ApplicationPath("/rest")
public class JerseyConfig extends ResourceConfig {

    public JerseyConfig() {
        register(AttachmentResource.class);
        register(ContentResource.class);
        register(MultiPartFeature.class);
    }

    @Bean(name = "multipartResolver")
    public CommonsMultipartResolver multipartResolver() {
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
        multipartResolver.setMaxUploadSize(100000);
        return multipartResolver;
    }

}

以及我所面临的关于多部分解析的问题的类,以及资源:

代码语言:javascript
复制
@Component
@Path("/attachments")
public class AttachmentResource {

    @POST 
    @Path("/store")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    @Produces(MediaType.APPLICATION_JSON)
    public Response store(@Context HttpServletRequest httpRequest) {

        for (Part part : httpRequest.getParts()) {
        ...
        }
    }
}

当调用getParts()时,我收到java.lang.IllegalStateException: Unable to process,因为没有提供多部分配置

我在application.properties中添加了以下属性:

代码语言:javascript
复制
spring.http.multipart.enabled=true
spring.http.multipart.max-file-size=100MB
spring.http.multipart.max-request-size=100MB
spring.http.multipart.file-size-threshold=0

如下所示:https://docs.spring.io/spring-boot/docs/1.5.13.RELEASE/reference/html/common-application-properties.html

这也是SpringBoot在启动时启用调试输出时记录的关于多部分配置的内容:

代码语言:javascript
复制
=========================
AUTO-CONFIGURATION REPORT
=========================

Positive matches:
-----------------
    MultipartAutoConfiguration matched:
        - @ConditionalOnClass found required classes 'javax.servlet.Servlet', 'org.springframework.web.multipart.support.StandardServletMultipartResolver', 'javax.servlet.MultipartConfigElement'; @ConditionalOnMissingClass did not find unwanted class (OnClassCondition)
        - @ConditionalOnProperty (spring.http.multipart.enabled) matched (OnPropertyCondition)

   MultipartAutoConfiguration#multipartConfigElement matched:
      - @ConditionalOnMissingBean (types: javax.servlet.MultipartConfigElement; SearchStrategy: all) did not find any beans (OnBeanCondition)


Negative matches:
-----------------
    MultipartAutoConfiguration#multipartResolver:
        Did not match:
            - @ConditionalOnMissingBean (types: org.springframework.web.multipart.MultipartResolver; SearchStrategy: all) found bean 'multipartResolver' (OnBeanCondition)

稍后编辑:

如果我将应用程序部署在独立的tomcat 8中,并将其添加到con/context.xml中,则它可以工作:

代码语言:javascript
复制
<Context allowCasualMultipartParsing="true">

或者在项目中的src/main/webapp/META-INF下添加一个context.xml文件:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<Context path="" allowCasualMultipartParsing="true"/>

但如果我使用嵌入式Tomcat启动项目,它就不起作用了。

EN

回答 1

Stack Overflow用户

发布于 2018-06-01 00:19:13

这不是如何在新泽西使用MultiPart的。如果想要获取所有部分,可以使用FormDataMultiPart作为实体参数

代码语言:javascript
复制
@POST
public Response post(FormDataMultiPart multiPart) {
    Map<String, List<FormDataBodyPart>> parts = multiPart.getParts(); 
}

如果希望按名称获取注入单个部件,则可以使用@FormDataParam注释,将部件的名称传递给该注释。

代码语言:javascript
复制
@POST
public Response post(@FormDataParam("file") InputStream file,
                     @FormDataParam("file") FormDataContentDisposition fileDatail) {

}

另请参阅

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50628251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档