2016-09-04 4 views
2

私はWebプログラミングの初心者です。興味のあるのは、URLとして利用できるビデオゲームのAPIがたくさんあるからです。SpringBootがRESTソースを消費する、HttpMessageConverterエラー

私は

に(http://services.runescape.com/m=itemdb_rs/api/catalogue/detail.json?item=21787)今、私は彼らのURLを交換し、ビデオゲームから1を追加しようとしています

https://spring.io/guides/gs/consuming-rest/)、次のコードを、このガイドに続き、それがspringbootとMavenで動作するようになりました次のエラーを生成します。

@SpringBootApplication 
public class Application { 

private static final Logger log = LoggerFactory.getLogger(Application.class); 

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

@Bean 
public RestTemplate restTemplate(RestTemplateBuilder builder) { 
    builder.additionalMessageConverters(new FakeConverter()); 
    return builder.build(); 
} 

@Bean 
public CommandLineRunner run(RestTemplate restTemplate) throws Exception { 
    return args -> { 
     Quote quote = restTemplate.getForObject(
       "http://services.runescape.com/m=itemdb_rs/api/catalogue/detail.json?item=21787", Quote.class); 
       //"http://gturnquist-quoters.cfapps.io/api/random", Quote.class); 
     log.info(quote.toString()); 
    }; 
} 



    java.lang.IllegalStateException: Failed to execute CommandLineRunner 
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:801) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:782) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
at org.springframework.boot.SpringApplication.afterRefresh(SpringApplication.java:769) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1185) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1174) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
at hello.Application.main(Application.java:25) [classes/:na] 
Caused by: org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [class hello.Quote] and content type [text/html;charset=ISO-8859-1] 
at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:109) ~[spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:622) ~[spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:580) ~[spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:287) ~[spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
at hello.Application.lambda$0(Application.java:37) [classes/:na] 
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:798) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
... 6 common frames omitted 

これは、URLリンクによって返される形式のように聞こえる「[text/htmlの;のcharset = ISO-8859-1]は、」春のRestTemplateでサポートされていません。これは、文字セットがJava Charsetクラスのデフォルトであり、URLに行くとテキストが通常のテキストのように見えるので私を奇妙なものにします。

手動でStringHttpMessageConverterを追加しようとしましたが、うまくいかなかった。

私は多分コードは、それが「text/htmlの」と言う部分を認識しないので、私は下記のとおりStringHttpMessageConverterをラップ「FakeConverter」をしたと思った:

public class FakeConverter implements HttpMessageConverter{ 

private StringHttpMessageConverter converter; 
ArrayList<MediaType> list = new ArrayList(); 
public FakeConverter() { 
    converter = new StringHttpMessageConverter(Charset.forName("ISO-8859-1")); 
} 

@Override 
public boolean canRead(Class arg0, MediaType arg1) { 
    // TODO Auto-generated method stub 
    return true; 
} 

@Override 
public boolean canWrite(Class arg0, MediaType arg1) { 
    // TODO Auto-generated method stub 
    return true; 
} 

@Override 
public List getSupportedMediaTypes() { 
    // TODO Auto-generated method stub 
    list.add(new MediaType("*", "text/html", Charset.forName("ISO-8859-1"))); 
    //list.add(new MediaType("text/html", "*", Charset.forName("ISO-8859-1"))); 
    //list.add(new MediaType("*", "*", Charset.forName("ISO-8859-1"))); 

    return list; 
} 

@Override 
public Object read(Class arg0, HttpInputMessage arg1) throws IOException, HttpMessageNotReadableException { 
    // TODO Auto-generated method stub 
    return converter.read(arg0, arg1); 
} 

@Override 
public void write(Object arg0, MediaType arg1, HttpOutputMessage arg2) 
     throws IOException, HttpMessageNotWritableException { 
    // TODO Auto-generated method stub 
    converter.write((String)arg0, arg1, arg2); 

} 

} 

私はcanReadを作ってるんです/ canWriteは常にtrueを試してブルートフォースでURLを読み込むように強制しますが、私は自分のURLをサポートするためのプログラムを入手できるかどうかを確認するためにこれらのMediaTypesを試しました。私は別の記事で "*"がMediaTypeクラスのワイルドカードとして機能するので、ダブルワイルドカードの試行が失敗するのを見て驚きました。

今私は紛失しており、リンクを読む方が簡単だと思いました。

あなたが持っている洞察力を提供し、より良い回答を提供するために必要な明確な質問をしてください。ビューのスプリングポイントから

おかげ

答えて

1

は、RestTemplateに登録HttpMessageConverterインスタンスのいずれも引用対象にテキスト/ HTMLコンテンツを変換することができません。対象のメソッドはHttpMessageConverter#canRead(Class、MediaType)です。上記のすべての実装は、GsonHttpMessageConverter、MappingJackson2MessageConverterなどを含むfalseを返します。

HttpMessageConverterはHTTP応答を読み取ることができないため、例外が発生して処理が失敗します。

あなたは、サーバーの応答を変更することができない場合は、あなたがあなた自身を書いて、登録する必要がありますアプリケーション/ JSON

にコンテンツタイプを設定し、それを修正し、サーバーの応答を変更することができる場合HttpMessageConverter(Springクラスを拡張することができます、AbstractGenericHttpMessageConverterとそのサブクラスを参照)、text/htmlを読み込み、変換できます。

代わりに、あなたは、GsonHttpMessageConverterに

public class GsonHttpMessageConverterDemo extends GsonHttpMessageConverter { 
    public GsonHttpMessageConverterDemo() { 
     List<MediaType> types = Arrays.asList(
       new MediaType("text", "html", DEFAULT_CHARSET), 
       new MediaType("application", "json", DEFAULT_CHARSET), 
       new MediaType("application", "*+json", DEFAULT_CHARSET) 
     ); 
     super.setSupportedMediaTypes(types); 
    } 
} 
を追加のメディアタイプのサポートを追加してみてくださいすることができます
関連する問題