When I use a FeignClient
it is setting the Content-Type
to application/x-www-form-urlencoded
instead of application/json;charset=UTF-8
.
If I use a RestTemplate
to send the same message the message header Content-Type
is correctly set to application/json;charset=UTF-8
.
Both the FeignClient
and RestTemplate
are using Eureka
for service discovery, and I discovered this problem by debugging the HTTP message received by the server.
The controller on the server side looks like this:
@RestController
@RequestMapping("/site/alarm")
public class SiteAlarmController {
@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public ResponseEntity<RaiseAlarmResponseDto> raiseAlarm(@RequestBody RaiseSiteAlarmRequestDto requestDto) {
...
}
My FeignClient
interface in the service that calls the alarm looks like this:
@FeignClient("alarm-service")
public interface AlarmFeignService {
@RequestMapping(method = RequestMethod.POST, value = "/site/alarm")
RaiseAlarmResponseDto raiseAlarm(@RequestBody RaiseSiteAlarmRequestDto requestDto);
}
The HTTP message headers from the FeignClient
are:
Accept: */*
Cache-Control: no-cache
Pragma: no-cache
User-Agent: Java/1.7.0_60
Host: smit005s-MacBook-Pro.local:9120
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 323
The alarm service doesn't like the Content-Type
and throws the following exception:
2015-04-22 12:12:28.580 thread="qtp1774842986-25" class="org.eclipse.jetty.servlet.ServletHandler" level="WARN"
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is feign.FeignException: status 415 reading AlarmFeignService#raiseAlarm(RaiseSiteAlarmRequestDto); content:
{"timestamp":1429701148576,"status":415,"error":"Unsupported Media Type","exception":"org.springframework.web.HttpMediaTypeNotSupportedException","message":"Unsupported Media Type","path":"/site/alarm"}
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:978) ~[spring-webmvc-4.1.5.RELEASE.jar:4.1.5.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857) ~[spring-webmvc-4.1.5.RELEASE.jar:4.1.5.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:618) ~[tomcat-embed-core-8.0.20.jar:8.0.20]
...
... /* commented rest of stack out */
...
If I change the client side code to use a RestTemplate
as follows:
@Service
public class AlarmService {
@Autowired
private RestTemplate restTemplate;
...
public void send(RaiseSiteAlarmRequestDto alarm) {
RaiseAlarmResponseDto result = restTemplate.postForObject("http://alarm-service/site/alarm",
raiseSiteAlarmRequestDto, RaiseAlarmResponseDto.class);
}
}
It works with the RestTemplate
, the alarm-service
receives the message and processes it successfully. The message headers sent by the RestTemplate
are:
Accept: application/json, application/*+json
Content-Type: application/json;charset=UTF-8
Cache-Control: no-cache
Pragma: no-cache
User-Agent: Java/1.7.0_60
Host: smit005s-MacBook-Pro.local:9120
Connection: keep-alive
Content-Length: 323
ResponseEntity<T>
of your controller to test if this was interfering with the Feign Client? My other guess is that Feign is not able to deserialize yourRaiseAlarmResponseDto
object. – Cohe@RequestBody
on the@FeignClient
doesn't do anything. Can you make a successful call without feign, but with eureka? – TmanContent-Type
header set incorrectly toapplication/x-www-form-urlencoded
. While theRestTemplate
sets theContent-Type
toapplication/json;charset=UTF-8
. I will update the question with this. – Uraliteconsumes="application/json"
to the@RequestMapping
on the@FeignClient
? – Tman