【springboot中使用@RequestBody MultiValueMap 总是报400,415错误-关于流程引擎flowable】

springboot中使用@RequestBody MultiValueMap 总是报400,415错误-关于流程引擎flowable

第一步:报错代码举例

在Spring boot 中使用 @RequestBody 会报错,提示错误 Content type ‘application/x-www-form-urlencoded;charset=UTF-8’ not supported,代码如下:

@RequestMapping(value = "/act/service/model/{modelId}/save", method = RequestMethod.POST)
public void saveModel(@PathVariable String modelId, @RequestBody MultiValueMap values) {
        // 具体业务处理逻辑代码
}

第二步:报错原因分析

这个在传统 spring MVC 中是有效的,但是在 Spring boot 中会报错。

传统是 Spring MVC 有效,是因为有 mvc:annotation-driven 注解,查资料,mvc:annotation-driven 注解配置了如下的内容
spring 3.1 版本:

这个找到的资料是 3.1 的,

但是我们注意下面最后一行配置
但是我们注意下面最后一行配置


            
        
              
                   
                    
                
          
    
          
              
                  
                  
                  
                  
                  
                  
                  
              
          
      
    
    
    
    
    
    
    

第三步:找到问题

但是我们注意上面最后一行配置
但是我们注意上面最后一行配置
但是我们注意上面最后一行配置

最后一个配置了 Jackson 的 json 处理程序,
在更新的版本中,AnnotationMethodHandlerAdapter 已经废弃,
使用的是 RequestMappingHandlerAdapter,
看下 RequestMappingHandlerAdapter 的源码。

	public RequestMappingHandlerAdapter() {
		StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter();
		stringHttpMessageConverter.setWriteAcceptCharset(false);  // see SPR-7316

		this.messageConverters = new ArrayList>(4);
		this.messageConverters.add(new ByteArrayHttpMessageConverter());
		this.messageConverters.add(stringHttpMessageConverter);
		this.messageConverters.add(new SourceHttpMessageConverter());
		this.messageConverters.add(new AllEncompassingFormHttpMessageConverter());
	}


第四步:解决方法-增加配置类增加对应数据格式的处理Bean

这里面没有了 json 的处理过程,我们把它加上

@EnableWebMvc
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
    
    @Bean
    public RequestMappingHandlerAdapter requestMappingHandlerAdapter() {
        RequestMappingHandlerAdapter adapter = new RequestMappingHandlerAdapter();
        
        List> converters = adapter.getMessageConverters();

        MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
        List supportedMediaTypes = new ArrayList();
        MediaType textMedia = new MediaType(MediaType.TEXT_PLAIN, Charset.forName("UTF-8"));
        supportedMediaTypes.add(textMedia);
        MediaType jsonMedia = new MediaType(MediaType.APPLICATION_JSON, Charset.forName("UTF-8"));
        supportedMediaTypes.add(jsonMedia);jsonConverter.setSupportedMediaTypes(supportedMediaTypes);
        
        converters.add(jsonConverter);
        
        
        adapter.setMessageConverters(converters);
        
       return adapter;
    }
}

你可能感兴趣的:(java,流程引擎,spring,boot,后端,java)