Сохранение имени хоста на ресурсе HATEOAS с помощью OpenFeign - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь добавить URI к ресурсу, расположенному в другом микросервисе, используя OpenFeign и ResourceAssembler, сохраняя при этом имя хоста из исходного запроса.

При выполнении запроса REST к ресурсу HATEOAS в другом микросервисе метод resource.getId () возвращает ссылку, где имя хоста - это хэш контейнера Docker вместо исходного имени хоста, использованного для выполнения запроса.

Контроллер

@RestController
@RequestMapping("/bulletins")
public class BulletinController {
// Autowired dependencies

    @GetMapping(produces = MediaTypes.HAL_JSON_VALUE)
    public ResponseEntity<PagedResources<BulletinResource>> getBulletins(Pageable pageable) {
        Page<Bulletin> bulletins = bulletinRepository.findAll(pageable);

        return ResponseEntity.ok(pagedResourceAssembler.toResource(bulletins, bulletinResourceAssembler));
    }
}

Ассемблер

@Component
public class BulletinResourceAssembler extends ResourceAssemblerSupport<Bulletin, BulletinResource> {
    private final AdministrationService administrationService;

    @Autowired
    public BulletinResourceAssembler(AdministrationService administrationService) {
        super(BulletinController.class, BulletinResource.class);
        this.administrationService = administrationService;
    }

    @Override
    public BulletinResource toResource(Bulletin entity) {
        Resource<Site> siteRessource = administrationService.getSiteBySiteCode(entity.getSiteCode());

        \\ Set other fields ...

        bulletinRessource.add(siteRessource.getId().withRel("site"));
        return bulletinRessource;
    }
}

Feign Client

@FeignClient(name = "${feign.administration.serviceId}", path = "/api")
public interface AdministrationService {

    @GetMapping(value = "/sites/{siteCode}")
    Resource<Site> getSiteBySiteCode(@PathVariable("siteCode") String siteCode);

}

Бюллетень ресурсов

@Data
public class BulletinResource extends ResourceSupport {
// fields
}

Ожидаемый результат
скручиваемость http://myhost/api/bulletins

{
  "_embedded" : {
    "bulletinResources" : [ {
      "entityId" : 1,
      "_links" : {
        "self" : {
          "href" : "http://myhost/api/bulletins/1"
        },
        "site" : {
          "href" : "http://myhost/api/sites/000"
        }
      }
    } ]
  },
  [...]
}

Фактический результат
скручиваемость http://myhost/api/bulletins

{
  "_embedded" : {
    "bulletinResources" : [ {
      "entityId" : 1,
      "_links" : {
        "self" : {
          "href" : "http://myhost/api/bulletins/1"
        },
        "site" : {
          "href" : "http://b4dc1a02586c:8080/api/sites/000"
        }
      }
    } ]
  },
  [...]
}

Обратите внимание, что href сайта - это b4dc1a02586c, который является идентификатором контейнера Docker.

1 Ответ

0 голосов
/ 30 апреля 2019

Решением было вручную определить RequestInterceptor для FeignClient и вручную добавить заголовок X-Forwarded-Host, а также определить bean-компонент ForwardedHeaderFilter в службе, к которой был сделан запрос.

Клиентская сторона

public class ForwardHostRequestInterceptor implements RequestInterceptor {

    private static final String HOST_HEADER = "Host";
    private static final String X_FORWARDED_HOST = "X-Forwarded-Host";

    @Override
    public void apply(RequestTemplate requestTemplate) {
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder
                .getRequestAttributes();

        if (requestAttributes == null) {
            return;
        }

        HttpServletRequest request = requestAttributes.getRequest();
        String host = request.getHeader(X_FORWARDED_HOST);
        if (host == null) {
            host = request.getHeader(HOST_HEADER);
        }

        requestTemplate.header(X_FORWARDED_HOST, host);
    }

}

Сторона производителя

Сторона производителя также потребовала изменения согласно обсуждению
https://github.com/spring-projects/spring-hateoas/issues/862
, которое ссылается на следующую документацию
https://docs.spring.io/spring-hateoas/docs/current-SNAPSHOT/reference/html/#server.link-builder.forwarded-headers
в котором говорится о добавлении следующего bean-компонента для использования прямых заголовков.

@Bean
ForwardedHeaderFilter forwardedHeaderFilter() {
    return new ForwardedHeaderFilter();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...