【问题标题】:Java : No suitable MessageConvertor found when using RestTemplateJava:使用 RestTemplate 时找不到合适的 MessageConvertor
【发布时间】:2015-09-19 17:24:18
【问题描述】:

我正在开发一个桌面 Java 应用程序,我正在尝试从服务器获取 RestPerson 对象类。两边的模型看起来一样,但我得到了如下所示的错误:

错误日志:

DEBUG: org.springframework.web.client.RestTemplate - Created GET request for "http://localhost:8080/rest/getloggedinuser"
DEBUG: org.springframework.web.client.RestTemplate - Setting request Accept header to [application/json, application/*+json]
Exception in thread "JavaFX Application Thread" org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [class .Model.RestPerson] and content type [text/html;charset=UTF-8]
    at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:108)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:553)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:506)
    at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:243)
    at .Controller.Controller$2.extractData(Controller.java:87)
    at .Controller.Controller$2.extractData(Controller.java:67)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:553)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:506)
    at .Controller.Controller.lambda$initialize$0(Controller.java:61)
    at .Controller.Controller$$Lambda$77/939480786.handle(Unknown Source)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.scene.Node.fireEvent(Node.java:8390)
    at javafx.scene.control.Button.fire(Button.java:185)
    at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182)
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96)
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89)
    at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.scene.Scene$MouseHandler.process(Scene.java:3758)
    at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3486)
    at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
DEBUG: org.springframework.web.client.RestTemplate - GET request for "http://localhost:8080/rest/getloggedinuser" resulted in 200 (OK)

在代码中,我首先进行身份验证,然后调用此方法。请让我知道我应该怎么做才能避免这些错误。我还将发布我拥有的 POM.xml。

RestTemplate rest = new RestTemplate();
String jsessionid = rest.execute("http://localhost:8080/j_spring_security_check", HttpMethod.POST,
    new RequestCallback() {
        @Override
        public void doWithRequest(ClientHttpRequest request) throws IOException {
            request.getBody().write(("j_username=" + usernameField.getText() + "&j_password=" + passwordField.getText()).getBytes());
        }
    }, new ResponseExtractor<String>() {
        @Override
        public String extractData(ClientHttpResponse response) throws IOException {
            List<String> cookies = response.getHeaders().get("Cookie");

            // assuming only one cookie with jsessionid as the only value
            if (cookies == null) {
                cookies = response.getHeaders().get("Set-Cookie");
            }

            String cookie = cookies.get(cookies.size() - 1);
            System.out.println("Cookie is " + cookie);
        }
    });
    // This method below gives problem.
    RestPerson restPerson = rest.getForObject(
                    "http://localhost:8080/rest/getloggedinuser", RestPerson.class);

这里是 Spring 配置:

@Configuration
@ComponentScan(basePackages = {"ourpackage"})
public class ApplicationConfiguration{


    @Bean
    public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
        PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
        Properties properties = new Properties();
        propertySourcesPlaceholderConfigurer.setProperties(properties);
        return propertySourcesPlaceholderConfigurer;
    }

    @Bean
    public MessageSource messageSource() {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        messageSource.setBasenames("messages", "org.springframework.security.messages");
        messageSource.setUseCodeAsDefaultMessage(true);
        return messageSource;
    }
}

【问题讨论】:

  • 不是真正直接回答您的问题,而是:您是否查看过触发呼叫时发生的问题?启用日志记录以查看此内容,或在您的应用程序和 REST 提供程序之间使用 membrane-soa.org 之类的代理。
  • @Marged :我使用 RestClient 进行测试,我得到了正确的 Person 对象。我正在编辑我的帖子以包含我从 RestClient 获得的内容。
  • Spring配置已修复,正在寻找如何在上面提到的ApplicationConfiguration.java文件中添加MessageConvertor。

标签: java spring rest maven resttemplate


【解决方案1】:

在 application-context.xml 中使用以下配置,您只需在要调用 Web 服务的地方自动装配 resttemplate。

<bean id="multiThreadedHttpConnectionManager" class="org.apache.commons.httpclient.MultiThreadedHttpConnectionManager">
</bean>

<bean id="httpClient" class="org.apache.commons.httpclient.HttpClient">
    <constructor-arg ref="multiThreadedHttpConnectionManager"/>
</bean>

<bean id="httpClientFactory" class="org.springframework.http.client.CommonsClientHttpRequestFactory">
    <constructor-arg ref="httpClient"/>
    <property name="readTimeout" value="${restTemplateTimeoutInMilliseconds}" />
</bean>

<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
    <constructor-arg ref="httpClientFactory"/>
    <property name="errorHandler" ref="restaurantsErrorHandler"/>
    <property name="messageConverters">
        <list>
            <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />
            <bean class="org.springframework.http.converter.FormHttpMessageConverter" />
            <bean class="org.springframework.http.converter.StringHttpMessageConverter" />
            <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter" />
            <ref bean="jsonConverter" />
       </list>
    </property>
</bean>

希望这个东西能得到解决。

【讨论】:

  • 感谢 Darshan 的回答,我一定会尝试一下,但是我的 Spring 配置搞砸了:stackoverflow.com/questions/31164743/…。我以前从未使用过 JavaFX,因此遇到了困难。
  • 你的 在哪里??
  • 最后在上面的配置中添加` `
  • 你用的是哪个版本的spring-web依赖,我是4.0.6.Release,所以找不到org.springframework.http.client.CommonsClientHttpRequestFactory和org.springframework。 http.converter.json.MappingJacksonHttpMessageConverte‌​r.
  • 春季版 4.0.4.RELEASE.
猜你喜欢
  • 2018-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-28
  • 2012-10-06
相关资源
最近更新 更多