2016-07-27 31 views
1

私はすでに同様のテーマに関するいくつかの質問/回答を確認しましたが、私の場合には適切な答えを見つけることができません。私は春のRestTemplateを使用しますが、以下の例外を除いて、第三者のサーバーからの応答を取得するために失敗していjava.net.SocketException:SpringのRestTemplateを使用しているサーバーからのファイルの終了が予期しないです。

Exception in thread "main" org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://64.76.157.19:8283/ENAP/ProveedorExterno/v1.0/insertarUltimaPosicion":Unexpected end of file from server; nested exception is java.net.SocketException: Unexpected end of file from server 
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:567) 
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:512) 
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:454) 
    at cl.waypoint.integracion.GenericCallback.sendEnap(GenericCallback.java:187) 
    at cl.waypoint.integracion.GenericCallback.main(GenericCallback.java:167) 
Caused by: java.net.SocketException: Unexpected end of file from server 
    at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:718) 
    at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:579) 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1322) 
    at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:468) 
    at org.springframework.http.client.SimpleClientHttpResponse.getRawStatusCode(SimpleClientHttpResponse.java:48) 
    at cl.waypoint.integracion.GenericCallback$LoggingRequestInterceptor.log(GenericCallback.java:229) 
    at cl.waypoint.integracion.GenericCallback$LoggingRequestInterceptor.intercept(GenericCallback.java:216) 
    at org.springframework.http.client.InterceptingClientHttpRequest$RequestExecution.execute(InterceptingClientHttpRequest.java:84) 
    at org.springframework.http.client.InterceptingClientHttpRequest.executeInternal(InterceptingClientHttpRequest.java:69) 
    at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48) 
    at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:53) 
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:551) 
    ... 4 more 

をしかし、コマンドラインを使用して同じ要求/ヘッダー/ペイロードを送信するときにカールがあるようですこれはそれの詳細な出力で、全く問題はない:

* Trying A.B.C.D... 
* Connected to A.B.C.D (A.B.C.D) port 8283 (#0) 
> POST /ENAP/ProveedorExterno/v1.0/insertarUltimaPosicion HTTP/1.1 
> Host: A.B.C.D:8283 
> User-Agent: curl/7.43.0 
> Accept: */* 
> Content-Type: application/json 
> Authorization: Bearer dsgfsdgf786dsfg7dsgf 
> Content-Length: 567 
> 
* upload completely sent off: 567 out of 567 bytes 
< HTTP/1.1 200 OK 
< Access-Control-Allow-Origin: * 
< Access-Control-Allow-Methods: POST 
< Access-Control-Allow-Headers: authorization,Access-Control-Allow-Origin,Content-Type 
< Content-Type: application/json 
< Date: Wed, 27 Jul 2016 13:35:26 GMT 
< Transfer-Encoding: chunked 
< 
* Connection #0 to host 64.76.157.19 left intact 

PS:認証トークンとサーバのIPアドレスがセキュリティ上の理由で変更されました。

春はしばらくハングしてから例外がスローされるようですが、おそらくデフォルトで何かを待っています...レスポンスのContent-Lengthヘッダー?もしそうなら、それを上書きすることはできますか?

例外は、以下の迎撃から来ている:インターセプターが無効になっている

private void sendEnap(String patente, String fecha, String latitud, String longitud, BigInteger sentido, 
     BigInteger velocidad, int ignicion) { 
    RestTemplate restTemplate = new RestTemplate(); 
    // set interceptors/requestFactory 
    ClientHttpRequestInterceptor ri = new LoggingRequestInterceptor(); 
    List<ClientHttpRequestInterceptor> ris = new ArrayList<ClientHttpRequestInterceptor>(); 
    ris.add(ri); 
    restTemplate.setInterceptors(ris); 

    MultiValueMap<String, String> headers = new LinkedMultiValueMap<String, String>(); 
    headers.add("Authorization", "Bearer " + ENANGAB_TOKEN); 
    headers.add("Content-Type", MediaType.APPLICATION_JSON.toString()); 
    headers.add("User-Agent", "Waypoint"); 
    EnapRequest enapRequest = new EnapRequest(patente, fecha, latitud, longitud, sentido, velocidad, ignicion); 
    HttpEntity<EnapRequest> request = new HttpEntity<EnapRequest>(enapRequest, headers); 

    ResponseEntity<EnapResponse> response = restTemplate.exchange(ENAP_ENDPOINT, HttpMethod.POST, request, 
      EnapResponse.class); 
    System.out.println(response.getBody()); 

} 

場合は、同じ例外が発生しますが、今、このスタックトレースを持つ:次のコードスニペットから使用されている

class LoggingRequestInterceptor implements ClientHttpRequestInterceptor { 

    @Override 
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) 
      throws IOException { 

     ClientHttpResponse response = execution.execute(request, body); 

     log(request, body, response); 

     return response; 
    } 

    private void log(HttpRequest request, byte[] body, ClientHttpResponse response) throws IOException { 
     HttpHeaders headers = request.getHeaders(); 
     System.out.println("============================="); 
     for (Entry<String, List<String>> header : headers.entrySet()) { 
      System.out.println(header.getKey() + ": " + header.getValue()); 
     } 
     System.out.println("============================="); 
     System.out.println(new String(body)); 
     System.out.println(response.getRawStatusCode()); 
     System.out.println(response.getStatusText()); 

    } 
} 

Exception in thread "main" org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://64.76.157.19:8283/ENAP/ProveedorExterno/v1.0/insertarUltimaPosicion":Unexpected end of file from server; nested exception is java.net.SocketException: Unexpected end of file from server 
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:567) 
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:512) 
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:454) 
    at cl.waypoint.integracion.GenericCallback.sendEnap(GenericCallback.java:187) 
    at cl.waypoint.integracion.GenericCallback.main(GenericCallback.java:167) 
Caused by: java.net.SocketException: Unexpected end of file from server 
    at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:718) 
    at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:579) 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1322) 
    at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:468) 
    at org.springframework.http.client.SimpleClientHttpResponse.getRawStatusCode(SimpleClientHttpResponse.java:48) 
    at org.springframework.http.client.AbstractClientHttpResponse.getStatusCode(AbstractClientHttpResponse.java:33) 
    at org.springframework.web.client.DefaultResponseErrorHandler.getHttpStatusCode(DefaultResponseErrorHandler.java:56) 
    at org.springframework.web.client.DefaultResponseErrorHandler.hasError(DefaultResponseErrorHandler.java:50) 
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:552) 
    ... 4 more 

上記は欠落しているヘッダーの別のヒントです応答では、どちらか、どのようにそのような待機を避けるために知っていない。

任意のヒントは

EDIT理解されるであろう:送信

ヘッダ:

Accept: [application/json, application/*+json] 
Authorization: [Bearer dsgfsdgf786dsfg7dsgf] 
Content-Type: [application/json] 
User-Agent: [Waypoint] 
Content-Length: [567] 

EnapRequestクラス: パッケージcl.waypoint.integracionと、

{ 
    "posicion": [ 
    { 
     "patente": "AB1234", 
     "latitud": "-36.752752", 
     "longitud": "-73.0804947", 
     "direccion": "120", 
     "velocidad": "65", 
     "transportista": "ENANGAB", 
     "sensora1": null, 
     "sensora2": null, 
     "sensora3": null, 
     "mopo_sensord1": null, 
     "mopo_sensord2": null, 
     "mopo_sensord3": null, 
     "mopo_sensord4": null, 
     "mopo_sensord5": null, 
     "mopo_sensord6": null, 
     "opcional1": null, 
     "opcional2": null, 
     "opcional3": null, 
     "opcional4": null, 
     "codigo_interno": null, 
     "fecha_hora": "2016-07-15T14:24:00", 
     "mopo_estado": "1", 
     "mopo_estado_ignicion": "1", 
     "moev_numero_evento": "45" 
    } 
    ], 
    "token_proveedor": "dsgfsdgf786dsfg7dsgf" 
} 

RestTemplateオブジェクトが既に次のサポートを設定している:リクエストボディが実際にJSON(カールと全く同じ、改善された読書のためここではかなりプリント)として送信されて

import java.math.BigInteger; 

import com.fasterxml.jackson.annotation.JsonProperty; 

public class EnapRequest { 

    @JsonProperty("token_proveedor") 
    private String tokenProveedor = GenericCallback.ENANGAB_TOKEN; 
    private Posicion[] posicion; 

    public EnapRequest(String patente, String fecha, String latitud, String longitud, BigInteger sentido, 
      BigInteger velocidad, int ignicion) { 
     posicion = new Posicion[1]; 
     posicion[0] = new Posicion(patente, fecha, latitud, longitud, sentido, velocidad, ignicion); 
    } 

    public String getTokenProveedor() { 
     return tokenProveedor; 
    } 

    public void setTokenProveedor(String tokenProveedor) { 
     this.tokenProveedor = tokenProveedor; 
    } 

    public Posicion[] getPosicion() { 
     return posicion; 
    } 

    public void setPosicion(Posicion[] posicion) { 
     this.posicion = posicion; 
    } 
} 

コンバーター:

class org.springframework.http.converter.ByteArrayHttpMessageConverter 
class org.springframework.http.converter.StringHttpMessageConverter 
class org.springframework.http.converter.ResourceHttpMessageConverter 
class org.springframework.http.converter.xml.SourceHttpMessageConverter 
class org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter 
class org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter 
class org.springframework.http.converter.json.MappingJackson2HttpMessageConverter 
+0

何かがあるようですPOSTリクエストのヘッダや本文に間違っている。 EnapRequestクラスを追加できますか? – Rocherlee

+0

@Rocherleeはヘッダ、ボディ、リクエストクラスを追加しました! – gvasquez

答えて

2

私の問題は、あなたの要求にはサーバーが解析できないため、返信できない間違ったデータ型があることだと思います。

JSON Content-TypeヘッダーでPOSTリクエストを送信しているので、EnapRequestはJSONエンコードされている必要があります。

はそれを行うには、あなたはEnapRequestはPOJOクラスであることを確認する必要があり、その後、sendEnap()

RestTemplate restTemplate = new RestTemplate(); 
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); 

内のコードを変更し、クラスパスにジャクソンのライブラリが含まれ

<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-databind</artifactId> 
    <version>2.8.1</version> 
</dependency> 
+0

リクエストヘッダー、本文、リクエストクラスを含む質問の編集をご覧ください。私はすでにJSONを送信しています – gvasquez

+0

ヘッダー 'User-Agent:Waypoint'と' Accept:application/json、application/* + json'で 'curl'を実行するとどうなりますか?現在、 'curl'は' User-Agent:curl/7.43.0'と 'Accept:*/*'を持っています – Rocherlee

+0

mmmm ....良いヒント、受け入れヘッダを変更するレスポンスはありません!レスポンスが "application/json; charset = UTF-8"であることをCurlが報告しても、RestTemplateをAccept:*/*に切り替えてください。 – gvasquez

関連する問題