Reputation: 5803
We are receiving the following error:
org.springframework.web.client.RestClientException: Could not write request:
no suitable HttpMessageConverter found for
request type [com.company.FileRecord] and
content type [application/x-java-serialized-object]
at org.springframework.web.client.RestTemplate$HttpEntityRequestCallback.doWithRequest(RestTemplate.java:770)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:549)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:527)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:472)
...
This is being thrown by an http:outbound-gateway
with a MappingJackson2HttpMessageConverter
attached, like so:
<bean id="jsonMessageConverter"
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes"
value="application/x-java-serialized-object"/>
</bean>
<int:transformer input-channel="transformationChannel"
output-channel="registrationQueue"
ref="fileTransformer"/>
<int:channel id="registrationQueue"/>
<int-http:outbound-gateway id="gateway"
request-channel="registrationQueue"
message-converters="jsonMessageConverter"
url-expression="@urlGenerator.resolve()"
http-method="POST"
expected-response-type="javax.ws.rs.core.Response"
reply-channel="nullChannel"
error-handler="httpResponseErrorHandler"/>
Out object being serialized is annotated for Jackson serialization:
public class FileRecord {
@JsonProperty
private final String id;
@JsonProperty
private final String path;
...
}
I believe this was working with Spring Integration 2.2 and started to fail with a migration to 3.0.
It jumps out at me as odd that we are trying to serialize as application/x-java-serialized-object
. I'd expect application/json
here. Perhaps a header-enricher
is called for? If so, I'd like to understand why exactly this needs to expressed. Shouldn't my jsonMessageConverter
know this?
Upvotes: 2
Views: 3074
Reputation: 5803
I'm not sure what the true cause or fix is, but I found a different approach which does the trick.
First, I removed the MappingJackson2HttpMessageConverter
bean entirely.
I then added an extra transformer to explicitly convert my POJO to JSON:
<int:transformer input-channel="objectTransformationChannel"
output-channel="jsonTransformationChannel"
ref="fileTransformer"/>
<int:channel id="jsonTransformationChannel"/>
<int:object-to-json-transformer input-channel="jsonTransformationChannel"
output-channel="registrationQueue"/>
<int:channel id="registrationQueue"/>
For the outbound-gateway
, I just needed to remove the message-converters
as my payload is now JSON.
<int-http:outbound-gateway id="gateway"
request-channel="registrationQueue"
url-expression="@urlGenerator.resolve()"
http-method="POST"
expected-response-type="javax.ws.rs.core.Response"
reply-channel="nullChannel"
error-handler="httpResponseErrorHandler"/>
Upvotes: 3
Reputation: 174504
??
You are replacing the default supported (json) media types with this...
<property name="supportedMediaTypes"
value="application/x-java-serialized-object"/>
...the constructor sets them up properly...
public MappingJackson2HttpMessageConverter() {
super(new MediaType("application", "json", DEFAULT_CHARSET),
new MediaType("application", "*+json", DEFAULT_CHARSET));
}
Just remove...
<property name="supportedMediaTypes"
value="application/x-java-serialized-object"/>
...and you should be good.
Upvotes: 0