Когда я использую FeignClient
это установив Content-Type
в application/x-www-form-urlencoded
вместо application/json;charset=UTF-8
.весна/Эврика/Feign - FeignClient установки Content-Type заголовка для приложения/х-WWW-форм-urlencoded
Если я использую RestTemplate
для отправки того же сообщения, заголовок сообщения Content-Type
правильно установлен в application/json;charset=UTF-8
.
Идентифицированы как FeignClient
, так и RestTemplate
, и я обнаружил эту проблему, отлаживая сообщение HTTP, полученное сервером.
Контроллер на стороне сервера выглядит следующим образом:
@RestController
@RequestMapping("/site/alarm")
public class SiteAlarmController {
@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public ResponseEntity<RaiseAlarmResponseDto> raiseAlarm(@RequestBody RaiseSiteAlarmRequestDto requestDto) {
...
}
Мой FeignClient
интерфейс в службе, которая вызывает тревогу выглядит следующим образом:
@FeignClient("alarm-service")
public interface AlarmFeignService {
@RequestMapping(method = RequestMethod.POST, value = "/site/alarm")
RaiseAlarmResponseDto raiseAlarm(@RequestBody RaiseSiteAlarmRequestDto requestDto);
}
Заголовки HTTP сообщений от FeignClient
являются :
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
Служба аварийной сигнализации «Т нравится Content-Type
и выдает следующее исключение:
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 */
...
Если изменить на стороне клиента код, чтобы использовать RestTemplate
следующим образом:
@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);
}
}
Он работает с RestTemplate
, то alarm-service
получает сообщение и успешно его обрабатывает. Заголовки сообщений, отправленных RestTemplate
являются:
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' вашего контроллера, чтобы проверить, помешало ли это вмешательству в работу с клиентом? Моя другая догадка заключается в том, что Feign не может десериализовать ваш объект 'RaiseAlarmResponseDto'. –
jebeaudet
'@ RequestBody' в' @ FeignClient' ничего не делает. Можете ли вы сделать успешный звонок без притворства, но с эврика? – spencergibb
Спасибо @spencergibb, что было хорошим предложением. Изменение его на RestTemplate работает, и он открывает сервис через Eureka.Когда я отправляю отладку на стороне получателя, я вижу, что клиент feign отправляет его с заголовком 'Content-Type', установленным неверно на' application/x-www-form-urlencoded'. В то время как 'RestTemplate' устанавливает' Content-Type' в 'application/json; charset = UTF-8'. Я обновлю вопрос. – user1232555