私は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クラスのワイルドカードとして機能するので、ダブルワイルドカードの試行が失敗するのを見て驚きました。
今私は紛失しており、リンクを読む方が簡単だと思いました。
あなたが持っている洞察力を提供し、より良い回答を提供するために必要な明確な質問をしてください。ビューのスプリングポイントから
おかげ