Spring RestTemplate 415不支持的媒体类型。

4

我尝试使用Spring Restful webservice。

我在两个Eclipse中创建了两个项目。在一个项目中,我编写了RestClient程序,在另一个项目中,我编写了webservice并在tomcat上启动了webservice。我正在尝试以json通信的形式传递Java bean对象在客户端和服务器之间。

但是我遇到了以下异常。

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

我尝试了很多方法,但都没有成功。以下是我的代码片段。

客户端方法:

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); 

看看这个回答:https://dev59.com/2m855IYBdhLWcg3w6Y5q 此外,您可以在rest api中使用“consumes”代替指定标头。类似这样: @RequestMapping(value = "/test", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE) - Sahil Nagpal
抱歉,我使用了 consumes = MediaType.APPLICATION_JSON_VALUE。但是仍然出现相同的问题。这是否与依赖关系 jar 文件有关? - Easy2DownVoteHard2Ans
好的,chrylis,让我用调试来检查一下。 - Easy2DownVoteHard2Ans
你使用哪个Web容器来部署服务?同时,你能提供Track类的代码吗? - SpinSage
@chrylis。我已经在服务中打印了httpheader,它显示为application/json。如果我从postTrack方法中删除@RequestBody,则不会出现异常。但是track对象将被打印为Track [title=null, singer=null]。 - Easy2DownVoteHard2Ans
显示剩余4条评论
1个回答

2
最终,通过以下更改使其工作:
在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 的 jars 文件添加到类路径中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接