Como ha señalado igor.zh, este puede ocurrir un problema si se usa la clase HttpComponentsMessageSender de Spring. Sin embargo, para ser más preciso, esto es solo un problema si pasa su propia instancia de HttpClient al constructor HttpComponentsMessageSender; de lo contrario, el problema se maneja automáticamente.
partir de la primavera-WS 2.1.4, la subclase HttpComponentsMessageSender.RemoveSoapHeadersInterceptor que se utiliza en el constructor por defecto se hizo pública para abordar esta cuestión (ver https://jira.spring.io/browse/SWS-835) y por lo tanto se puede utilizar en sus propios HttpClient instancias, en vez de escribir su propia clase para hacerlo. También borra el encabezado HTTP.TRANSFER_ENCODING.
Utilice el método HttpClientBuilder.addInterceptorFirst para inyectar este interceptor en su propia instancia de HttpClient. Ejemplo a continuación utilizando el cableado de beans XML. Si alguien conoce una forma más concisa de construir la instancia de HttpClient (aparte de escribir una clase de beans de fábrica), ¡soy todo oídos!
<bean id="httpClientBuilder" class="org.apache.http.impl.client.HttpClientBuilder" factory-method="create"/>
<bean id="interceptedHttpClientBuilder" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject" ref="httpClientBuilder" />
<property name="targetMethod" value="addInterceptorFirst"> </property>
<property name="arguments">
<list>
<bean class="org.springframework.ws.transport.http.HttpComponentsMessageSender.RemoveSoapHeadersInterceptor"/>
</list>
</property>
</bean>
<bean id="httpClient" factory-bean="interceptedHttpClientBuilder" factory-method="build" />
<bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">
<constructor-arg ref="messageFactory"/>
<property name="messageSender">
<bean class="org.springframework.ws.transport.http.HttpComponentsMessageSender">
<property name="httpClient" ref="httpClient"/>
</bean>
</property>
</bean>
Alternativamente, si se puede, simplemente permiten HttpComponentsMessageSender para construir su propia HttpClient ejemplo, en lugar de pasar uno a ella. Nota menor sobre esto: a partir de spring-ws 2.2.0-RELEASE, el constructor predeterminado para HttpComponentsMessageSender continúa usando la clase DefaultHttpClient, que ahora está en desuso. Espero que esto se aborde en una versión futura.
Exactamente. Nunca tendrá que configurar Content-Length usted mismo en Java a menos que esté utilizando un socket simple. – EJP
@EJP - o las clases java.net URLConnection. –
No, lo hacen por ti. Solo tiene que configurarlo si * no * usa esos. – EJP