Конфигурация из нескольких частей на Джерси с Spring Boot - PullRequest
0 голосов
/ 31 мая 2018

У меня проблемы при попытке проанализировать HttpServletRequest, содержащий файлы, состоящие из нескольких частей.Я перепробовал все решения других постов, касающиеся исключения, с которым я сталкиваюсь, но, похоже, ничего не работает.

Это соответствующие зависимости для проекта:

<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 Инициализатор приложения:

@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:

@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;
    }

}

И класс, где я сталкиваюсь с проблемой, касающейся многоэтапного анализа, а также ресурса:

@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: Невозможно обработать детали, так как не была предоставлена ​​конфигурация из нескольких частей

Я добавил эти свойства в application.properties:

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 регистрирует с включенным отладочным выходом при запускеотносительно конфигурации Multipart:

=========================
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, оно будет работать:

<Context allowCasualMultipartParsing="true">

илидобавьте файл context.xml в src / main / webapp / META-INF в проект:

<?xml version="1.0" encoding="UTF-8"?>
<Context path="" allowCasualMultipartParsing="true"/>

Но это не сработает, если я начну проект со встроенным Tomcat.

1 Ответ

0 голосов
/ 31 мая 2018

Это не то, как использовать MultiPart с Джерси.Если вы хотите получить все детали, вы можете использовать FormDataMultiPart в качестве параметра сущности

@POST
public Response post(FormDataMultiPart multiPart) {
    Map<String, List<FormDataBodyPart>> parts = multiPart.getParts(); 
}

Если вы хотите получать отдельные детали по имени, вы можете использовать @FormDataParam аннотация, передавая имя детали к аннотации.

@POST
public Response post(@FormDataParam("file") InputStream file,
                     @FormDataParam("file") FormDataContentDisposition fileDatail) {

}

См. также

...