Spring RestTemplate 415 不支持的媒体类型

Posted

技术标签:

【中文标题】Spring RestTemplate 415 不支持的媒体类型【英文标题】:Spring RestTemplate 415 Unsupported Media Type 【发布时间】:2017-04-03 05:14:32 【问题描述】:

我尝试使用 Spring Restful 网络服务。

我在两个 Eclipse 中创建了两个项目。在一个项目中,我编写了 RestClient 程序,在另一个项目中,我编写了 web 服务并通过 tomcat 盯着 web 服务。我正在尝试将 java bean 作为客户端和服务器之间的 json 通信传递。

但我遇到了以下异常。

org.springframework.web.client.HttpClientErrorException: 415 Unsupported Media Type

我尝试了很多方法,但都没有成功。下面是我的代码 sn-p。

客户端方法:

private static void postTrack() 
    try 
        final String uri = "http://localhost:8181/RestWS/test";

        Track track = new Track();
        track.setTitle("Singer");
        track.setSinger("Shas");

        RestTemplate restTemplate = new RestTemplate();

        Track responseTrack = restTemplate.postForObject(uri, track, Track.class);

     catch (Exception e) 
        e.printStackTrace();
    

服务方式:

@RequestMapping(value = "/test", method = RequestMethod.POST, headers = "Accept=application/json")
    public @ResponseBody Track testMethod(@RequestBody Track track) 
        System.out.println(" Inside Test Method : ");
        System.out.println(" In GreetingController.greeting() "+track.getSinger());
        return track;
    

跟踪类:

public class Track 

    String title;
    String singer;

    public String getTitle() 
        return title;
    

    public void setTitle(String title) 
        this.title = title;
    

    public String getSinger() 
        return singer;
    

    public void setSinger(String singer) 
        this.singer = singer;
    

    @Override
    public String toString() 
        return "Track [title=" + title + ", singer=" + singer + "]";
    

我也试过

restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
restTemplate.getMessageConverters().add(new StringHttpMessageConverter());

还有

MultiValueMap<String, String> header = new LinkedMultiValueMap<String, String>(); 
header.add("Content-Type", "application/json");           
HttpEntity<Object> httpEntity = new HttpEntity<Object>(track, header); 
ResponseEntity<Track> response = restTemplate.exchange(uri, HttpMethod.POST, httpEntity, Track.class); 

【问题讨论】:

看看这个答案。 ***.com/questions/4075991/… 另外,您可以使用“consumes”而不是在其余 api 中指定标头。像这样:@RequestMapping(value = "/test", method = RequestMethod.POST, consumes = MediaType .APPLICATION_JSON_VALUE) 我尝试了这个 URL 的答案,但没有成功。 对不起,我使用了消耗 = MediaType.APPLICATION_JSON_VALUE。但同样的问题。是否存在与依赖 jar 文件相关的问题? 打开org.springframework.web 登录到调试,看看传入的媒体类型。特别是,确认它没有使用表单编码。作为说明,请查看较新的 Spring 复合注释;你可以使用@RestController,你可以简化你到@PostMapping("/test")的映射。 好的,chrylis,让我检查一下调试。 【参考方案1】:

最后它通过如下更改来工作:

在 servlet xml 中添加以下行。

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <property name="messageConverters"> 
        <list> 
            <ref bean="jsonConverter" /> 
        </list> 
    </property> 
</bean> 

<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> 
    <property name="supportedMediaTypes" value="application/json" /> 
</bean>

在类路径中添加 jackson-core-2.5.0 和 jackson-annotations-2.5.0 jar。

【讨论】:

以上是关于Spring RestTemplate 415 不支持的媒体类型的主要内容,如果未能解决你的问题,请参考以下文章

RestTemplate - 415 UNSUPPORTED_MEDIA_TYPE 错误

RestTemplate远程调用POST请求:HTTP 415 Unsupported Media Type

Spring,Angular.js 415 不支持的媒体类型错误

Spring MVC 415 不支持的媒体类型

Spring mvc ajax文件上传导致415(不支持的媒体类型)

解决了! - Spring boot:获取 415 不支持的媒体类型