2014-09-25 90 views
1

我也在發佈有關可怕的「當前請求不是多部分請求」消息。當前請求不是MockMultipartFile測試的多部分請求

我使用的是最新的Spring和兄弟姐妹,並具有以下配置:

@Configuration 
@EnableWebMvc 
@EnableSpringDataWebSupport 
@ComponentScan(basePackages = { "com.....project.rest" }) 
@Import({JsonConfiguration.class}) 
public class WebConfiguration extends WebMvcConfigurerAdapter { 

    @Bean 
    public MultipartResolver multipartResolver() { 
     CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(); 
     multipartResolver.setMaxUploadSize(1024000); 
     return multipartResolver; 
    } 
} 

我也有一個控制器處理程序:

@Controller 
@RequestMapping(RESTConstants.SLASH + RESTConstants.BTS) 
public class BTSUploadController { 

     @RequestMapping(value = RESTConstants.SLASH + RESTConstants.UPLOAD, method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) 
     @ResponseBody 
     public String handleFileUpload(@RequestPart(value = "json") JsonPojo pojo, @RequestParam(value = "random") String random, @RequestParam(value = "data", required = false) List<MultipartFile> uploadedFiles, BindingResult result) { 
    } 
} 

隨着常數:

public static final String SLASH = "/"; 
public static final String BTS = "bts"; 
public static final String UPLOAD = "upload"; 

最後測試:

@Before 
public void setup() { 
    this.mockMvc = MockMvcBuilders.webAppContextSetup(this.webApplicationContext).addFilters(this.springSecurityFilterChain).build(); 
} 

@Before 
public void beforeAnyTest() throws Exception { 
    httpHeaders = Common.createAuthenticationHeaders("stephane" + ":" + PASSWORD); 
} 

@Test 
public void test() throws Exception { 
    MockMultipartFile firstFile = new MockMultipartFile("data", "filename.txt", "text/plain", "some xml".getBytes()); 
    MockMultipartFile secondFile = new MockMultipartFile("data", "other-file-name.data", "text/plain", "some other type".getBytes()); 
    MockMultipartFile jsonFile = new MockMultipartFile("json", "", "application/json", "{\"json\": \"someValue\"}".getBytes()); 

    MvcResult mvcResult = this.mockMvc.perform(
      fileUpload(RESTConstants.SLASH + RESTConstants.BTS + RESTConstants.SLASH + RESTConstants.UPLOAD) 
      .file(firstFile) 
      .file(secondFile) 
      .file(jsonFile) 
      .headers(httpHeaders) 
      .param("random", "4") 
      ) 
      .andExpect(status().isOk()) 
      .andExpect(content().string("success")) 
      .andReturn(); 
    String value = deserialize(mvcResult, String.class); 
    assertEquals(value, "success"); 

}

但Maven構建給我下面的消息:

org.springframework.web.multipart.MultipartException: The current request is not a multipart request 

任何線索?

我一直在使用Google,現在一個鐘頭......

編輯:完整的堆棧跟蹤

2014-09-26 18:52:13,163 ERROR [ExceptionsHandler] There was an RTE error. 
2014-09-26 18:52:13,182 DEBUG [ExceptionsHandler] org.springframework.web.multipart.MultipartException: The current request is not a multipart request 
    at org.springframework.web.servlet.mvc.method.annotation.RequestPartMethodArgumentResolver.assertIsMultipartRequest(RequestPartMethodArgumentResolver.java:178) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestPartMethodArgumentResolver.resolveArgument(RequestPartMethodArgumentResolver.java:116) 
    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:781) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:721) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961) 
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:688) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) 
    at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:62) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:770) 
    at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:170) 
    at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:137) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118) 
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:154) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:201) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:57) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192) 
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160) 
    at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:137) 
    at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:145) 
    at com.nsn.nitro.project.rest.controller.BTSUploadControllerTest.test(BTSUploadControllerTest.java:33) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:72) 
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:81) 
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:216) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:82) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:60) 
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:67) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:162) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:264) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124) 
    at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200) 

編輯:一些更多的配置

public class WebInit implements WebApplicationInitializer { 

    private static Logger logger = LoggerFactory.getLogger(WebInit.class); 

    @Override 
    public void onStartup(ServletContext servletContext) throws ServletException { 
     registerListener(servletContext); 

     registerDispatcherServlet(servletContext); 

     registerJspServlet(servletContext); 
    } 

    private void registerListener(ServletContext servletContext) { 
     // Create the root application context 
     AnnotationConfigWebApplicationContext appContext = createContext(ApplicationConfiguration.class, WebSecurityConfiguration.class); 

     // Set the application display name 
     appContext.setDisplayName("NI"); 

     // Create the Spring Container shared by all servlets and filters 
     servletContext.addListener(new ContextLoaderListener(appContext)); 
    } 

    private void registerDispatcherServlet(ServletContext servletContext) { 
     AnnotationConfigWebApplicationContext webApplicationContext = createContext(WebConfiguration.class); 

     ServletRegistration.Dynamic dynamic = servletContext.addServlet("dispatcher", new DispatcherServlet(webApplicationContext)); 
     dynamic.setLoadOnStartup(1); 

     Set<String> mappingConflicts = dynamic.addMapping("/"); 

     if (!mappingConflicts.isEmpty()) { 
      for (String mappingConflict : mappingConflicts) { 
      logger.error("Mapping conflict: " + mappingConflict); 
      } 
      throw new IllegalStateException(
       "The servlet cannot be mapped to '/'"); 
     } 

//  dynamic.setMultipartConfig(webApplicationContext.getBean(MultipartConfigElement.class)); 
    } 

    private void registerJspServlet(ServletContext servletContext) { 
    } 

    private AnnotationConfigWebApplicationContext createContext(final Class... modules) { 
     AnnotationConfigWebApplicationContext appContext = new AnnotationConfigWebApplicationContext(); 
     appContext.register(modules); 
     return appContext; 
    } 

@Configuration 
@Import({ ApplicationContext.class }) 
public class ApplicationConfiguration extends WebMvcConfigurerAdapter { 

    // Declare "application" scope beans here, that is, beans that are not only used by the web context 

} 

@Configuration 
@Import({ DatabaseProperties.class, JpaService.class, Log4j.class }) 
@EnableTransactionManagement 
@EnableJpaRepositories(basePackages = { "com....project.data.jpa" }, repositoryFactoryBeanClass = com.nsn.nitro.project.data.jpa.repository.GenericRepositoryFactoryBean.class) 
public class ApplicationContext { 

    @Autowired 
    private DatabaseProperties databaseProperties; 

    @Bean 
    public DataSource dataSource() throws PropertyVetoException { 
     ComboPooledDataSource dataSource = new ComboPooledDataSource(); 
     dataSource.setDriverClass(databaseProperties.getHibernateDriverClassName()); 
     dataSource.setJdbcUrl(databaseProperties.getDataSourceUrl()); 
     dataSource.setUser(databaseProperties.getDataSourceUsername()); 
     dataSource.setPassword(databaseProperties.getDataSourcePassword()); 
     dataSource.setAcquireIncrement(5); 
     dataSource.setMaxStatementsPerConnection(20); 
     dataSource.setMaxStatements(100); 
     dataSource.setMinPoolSize(2); 
     dataSource.setMaxPoolSize(5); 
     return dataSource; 
    } 

    @Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() throws PropertyVetoException { 
     HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter(); 
     jpaVendorAdapter.setDatabasePlatform(databaseProperties.getHibernateDialect()); 
     jpaVendorAdapter.setShowSql(true); 
     jpaVendorAdapter.setGenerateDdl(false); 

     Map<String, String> jpaPropertiesMap = new HashMap<String, String>(); 
     jpaPropertiesMap.put("hibernate.dialect", databaseProperties.getHibernateDialect()); 
     jpaPropertiesMap.put("hibernate.show_sql", "true"); 
     jpaPropertiesMap.put("hibernate.format_sql", "true"); 
// http://stackoverflow.com/questions/25932976/foreign-key-data-integrity-violation-on-oracle-x-10g 
//  jpaPropertiesMap.put("hibernate.connection.autocommit", "true"); 
//  jpaPropertiesMap.put("hibernate.cache.use_query_cache", "false"); 
//  jpaPropertiesMap.put("hibernate.cache.use_second_level_cache", "false"); 
     jpaPropertiesMap.put("hibernate.hbm2ddl.auto", databaseProperties.getHibernateHbm2ddlAuto()); 
     jpaPropertiesMap.put("hibernate.transaction.factory_class", "org.hibernate.transaction.JDBCTransactionFactory"); 
     jpaPropertiesMap.put("hibernate.ejb.naming_strategy", "org.hibernate.cfg.ImprovedNamingStrategy"); 
     jpaPropertiesMap.put("hibernate.c3p0.min_size", "5"); 
     jpaPropertiesMap.put("hibernate.c3p0.max_size", "20"); 
     jpaPropertiesMap.put("hibernate.c3p0.timeout", "1000"); 
     jpaPropertiesMap.put("hibernate.c3p0.max_statements", "50"); 

     LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean(); 
     factoryBean.setJpaVendorAdapter(jpaVendorAdapter); 
     factoryBean.setPackagesToScan("com.....project.data.jpa.domain"); 
     factoryBean.setJpaPropertyMap(jpaPropertiesMap); 
     String[] mappingsResources = new String[] {"custom/typedef.hbm.xml"};   
     factoryBean.setMappingResources(mappingsResources); 
     factoryBean.setDataSource(dataSource()); 
     return factoryBean; 
    } 

    @Bean 
    public JpaTransactionManager transactionManager() { 
     JpaTransactionManager transactionManager = new JpaTransactionManager(); 
     try { 
      transactionManager.setEntityManagerFactory(entityManagerFactory().getObject()); 
     } catch (Exception x) { 
      throw new RuntimeException(x); 
     } 
     return transactionManager; 
    } 

    @Bean 
    public HibernateExceptionTranslator hibernateExceptionTranslator(){ 
     return new HibernateExceptionTranslator(); 
    } 

    @Bean 
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { 
     return new PropertySourcesPlaceholderConfigurer(); 
    } 

    @Bean 
    public PersistenceExceptionTranslationPostProcessor persistenceExceptionTranslationPostProcessor() { 
     return new PersistenceExceptionTranslationPostProcessor(); 
    } 

} 

一些Maven依賴是:

<org.springframework.version>4.1.0.RELEASE</org.springframework.version> 
... 
    <repositories> 
    <repository> 
     <id>spring-snapshots</id> 
     <url>http://repo.spring.io/libs-snapshot</url> 
     <snapshots> 
     <enabled>true</enabled> 
     </snapshots> 
    </repository> 
    </repositories> 
    <pluginRepositories> 
    <pluginRepository> 
     <id>spring-snapshots</id> 
     <url>http://repo.spring.io/libs-snapshot</url> 
     <snapshots><enabled>true</enabled></snapshots> 
    </pluginRepository> 
    </pluginRepositories> 
    <dependencies> 
     <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-framework-bom</artifactId> 
     <version>${org.springframework.version}</version> 
     <type>pom</type> 
     <scope>import</scope> 
     </dependency> 
     <dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-bom</artifactId> 
     <version>${org.springframework.security.version}</version> 
     <type>pom</type> 
     <scope>import</scope> 
     </dependency> 
    </dependencies> 
    <dependency> 
     <groupId>commons-fileupload</groupId> 
     <artifactId>commons-fileupload</artifactId> 
     <version>1.3.1</version> 
    </dependency> 
    <dependency> 
     <groupId>commons-io</groupId> 
     <artifactId>commons-io</artifactId> 
     <version>2.4</version> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>javax.servlet-api</artifactId> 
     <version>3.0.1</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>javax.validation</groupId> 
     <artifactId>validation-api</artifactId> 
     <version>1.1.0.Final</version> 
    </dependency> 
    <dependency> 
     <groupId>com.jayway.jsonpath</groupId> 
     <artifactId>json-path</artifactId> 
     <version>0.9.1</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-databind</artifactId> 
     <version>2.4.2</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.datatype</groupId> 
     <artifactId>jackson-datatype-joda</artifactId> 
     <version>2.4.2</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-web</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-webmvc</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-test</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.hateoas</groupId> 
     <artifactId>spring-hateoas</artifactId> 
     <version>0.16.0.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.plugin</groupId> 
     <artifactId>spring-plugin-core</artifactId> 
     <version>0.8.0.RELEASE</version> 
    </dependency> 
+0

你能告訴我們你的'MockMvc'設置(配置等)嗎? – 2014-09-26 01:02:25

+0

我添加了MockMvc設置,但它非常光滑。還有什麼我應該顯示?謝謝。 – Stephane 2014-09-26 06:38:13

+0

我想看看您的實際Web應用程序上下文。另外,什麼是'RestConstants.BTS'?這與你的'@ Controller'級別'@ RequestMapping'匹配嗎? – 2014-09-26 14:38:11

回答

2

我遇到了同樣的問題。我意識到我的請求中包含無效標題,例如

content-type : application/json 

刪除此標題後,錯誤消失。希望這可以幫助。

相關問題