【问题标题】:Spring RestTemplate how to use POJO with application/x-www-form-urlencoded?Spring RestTemplate 如何将 POJO 与 application/x-www-form-urlencoded 一起使用?
【发布时间】:2019-05-12 21:50:04
【问题描述】:

当我尝试将 POJO 与 MediaType.APPLICATION_FORM_URLENCODED 一起使用时

    ExampleRequest exampleRequest = exampleRequest();
    exampleRequest.setId("id");
    exampleRequest.setName("name");

    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

    HttpEntity<ExampleRequest> exampleRequestEntity = new HttpEntity<>(exampleRequest, headers);

    restTemplate.postForObject(url, exampleRequestEntity, String.class)

我明白了:

org.springframework.web.client.RestClientException: No HttpMessageConverter for [ExampleRequest] and content type [application/x-www-form-urlencoded]

有什么方法可以将 POJO 与 application/x-www-form-urlencoded 一起使用而不是 MultiValueMap&lt;String, String&gt; map

【问题讨论】:

  • 只需将FormHttpMessageConverter 传递给RestTemplate 构造函数就可以解决问题(例如new RestTemplate(List.of(new FormHttpMessageConverter())))。

标签: java spring spring-boot resttemplate


【解决方案1】:

FormHttpMessageConverter 可能会丢失。您是否尝试过手动添加?

@SpringBootApplication
public class App extends WebMvcConfigurerAdapter {

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

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        FormHttpMessageConverter converter = new FormHttpMessageConverter();
        MediaType mediaType = new MediaType("application","x-www-form-urlencoded", Charset.forName("UTF-8"));
        converter.setSupportedMediaTypes(Arrays.asList(mediaType));
        converters.add(converter);
        super.configureMessageConverters(converters);
    }
}

(与spring boot相关)

【讨论】:

    【解决方案2】:

    可以使用FormHttpMessageConverter,它能够在application/x-www-form-urlencoded 媒体类型所需的MultiValueMap&lt;String, String&gt; 之间转换数据。在实现WebMvcConfigurer的类中添加如下配置。

    @Bean
    public FormHttpMessageConverter formHttpMessageConverter() {
    
        MediaType mediaType = new MediaType("application", "x-www-form-urlencoded", 
            Charset.forName("UTF-8"))
    
        FormHttpMessageConverter formHttpMessageConverter= new FormHttpMessageConverter();
        formHttpMessageConverter.setSupportedMediaTypes(Collections.singletonList(mediaType));
        return formHttpMessageConverter;
    }
    
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
         converters.add(formHttpMessageConverter());
         super.configureMessageConverters(converters);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-11
      • 2014-03-30
      • 2019-02-04
      • 1970-01-01
      • 2019-12-04
      • 1970-01-01
      • 2019-10-26
      • 2011-11-15
      相关资源
      最近更新 更多