あなたが貼り付けられたコードは、私は数時間前にそのコードをデバッグしてきたので、私は知っている
SimpleClientHttpRequestFactory.prepareConnection(HttpURLConnection connection, String httpMethod)
からです。 restTemplateを使用してbodyでHTTP GETを実行する必要がありました。そこでSimpleClientHttpRequestFactoryを拡張し、prepareConnectionをオーバーライドし、新しいファクトリを使用して新しいRestTemplateを作成しました。
public class SimpleClientHttpRequestWithGetBodyFactory extends SimpleClientHttpRequestFactory {
@Override
protected void prepareConnection(HttpURLConnection connection, String httpMethod) throws IOException {
super.prepareConnection(connection, httpMethod);
if ("GET".equals(httpMethod)) {
connection.setDoOutput(true);
}
}
}
(春ブーツ(@RunWith(SpringRunner.class) @SpringBootTestを使用して作業しているこの工場
new RestTemplate(new SimpleClientHttpRequestWithGetBodyFactory());
ソリューションを証明するためのテストに基づいて新しいRestTemplateを作成します。 webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT))
public class TestRestTemplateTests extends AbstractIntegrationTests {
@Test
public void testMethod() {
RestTemplate restTemplate = new RestTemplate(new SimpleClientHttpRequestWithBodyForGetFactory());
HttpEntity<String> requestEntity = new HttpEntity<>("expected body");
ResponseEntity<String> responseEntity = restTemplate.exchange("http://localhost:18181/test", HttpMethod.GET, requestEntity, String.class);
assertThat(responseEntity.getBody()).isEqualTo(requestEntity.getBody());
}
@Controller("/test")
static class TestController {
@RequestMapping
public @ResponseBody String testMethod(HttpServletRequest request) throws IOException {
return request.getReader().readLine();
}
}
}
httpMethod = OPTIONSのconnection.setDoOutput(true)を使用して、同じ派生SimpleClientHttpRequestWithGetBodyFactoryを再テストしました。残りのテンプレートが投げています:org.springframework.web.client.ResourceAccessException: "http:// localhost:18181/test"のOPTIONSリクエストでI/Oエラーが発生しました:HTTPメソッドOPTIONSは出力をサポートしていません。ネストされた例外はjava.net.ProtocolExceptionです:HTTPメソッドOPTIONSは出力をサポートしていません。これは、Optionsにconnection.setDoOutput(false)がある理由です。 –