Spring Cloud OpenFeign не удалось создать параметры динамического запроса - PullRequest
0 голосов
/ 29 ноября 2018

Spring cloud openFeign не может создавать динамические параметры запроса.Выдает ниже исключение, потому что SpringMvcContract пытается найти атрибут значения RequestParam, который не существует.

java.lang.IllegalStateException: RequestParam.value() was empty on parameter 0


@RequestMapping(method = RequestMethod.GET, value = "/orders")
Pageable<Order> searchOrder2(@RequestParam CustomObject customObject);

Я пытаюсь использовать @QueryMap вместо @RequestParam, но @QueryMap не генерирует параметры запроса.

Кстати @RequestParam Map<String, Object> params Параметр метода отлично работает для генерации параметра динамического запроса.

Но я хочу использовать пользовательский объект, симулирующий клиент может генерировать параметры динамического запроса из атрибутов объекта.

Спасибо

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Из Spring Cloud OpenFeign Документы :

Spring Cloud OpenFeign предоставляет эквивалентную аннотацию @SpringQueryMap, которая используется для аннотирования параметра POJO или Map в качестве карты параметров запроса

Итак, ваш код должен быть:

@RequestMapping(method = RequestMethod.GET, value = "/orders")
Pageable<Order> searchOrder2(@SpringQueryMap @ModelAttribute CustomObject customObject);
0 голосов
/ 03 декабря 2018

spring-cloud-starter-feign имеет открытый выпуск для поддержки объекта pojo в качестве параметра запроса.Поэтому я использовал перехватчик запросов, который берет объект из метода feign и создает часть запроса url из его полей.Спасибо @ charlesvhe

public class DynamicQueryRequestInterceptor implements RequestInterceptor {

private static final Logger LOGGER = LoggerFactory.getLogger(DynamicQueryRequestInterceptor.class);

private static final String EMPTY = "";

@Autowired
private ObjectMapper objectMapper;

@Override
public void apply(RequestTemplate template) {
    if ("GET".equals(template.method()) && Objects.nonNull(template.body())) {
        try {
            JsonNode jsonNode = objectMapper.readTree(template.body());
            template.body(null);

            Map<String, Collection<String>> queries = new HashMap<>();
            buildQuery(jsonNode, EMPTY, queries);
            template.queries(queries);
        } catch (IOException e) {
            LOGGER.error("IOException occurred while try to create http query");
        }
    }
}

private void buildQuery(JsonNode jsonNode, String path, Map<String, Collection<String>> queries) {
    if (!jsonNode.isContainerNode()) {
        if (jsonNode.isNull()) {
            return;
        }
        Collection<String> values = queries.computeIfAbsent(path, k -> new ArrayList<>());
        values.add(jsonNode.asText());
        return;
    }
    if (jsonNode.isArray()) {
        Iterator<JsonNode> it = jsonNode.elements();
        while (it.hasNext()) {
            buildQuery(it.next(), path, queries);
        }
    } else {
        Iterator<Map.Entry<String, JsonNode>> it = jsonNode.fields();
        while (it.hasNext()) {
            Map.Entry<String, JsonNode> entry = it.next();
            if (StringUtils.hasText(path)) {
                buildQuery(entry.getValue(), path + "." + entry.getKey(), queries);
            } else {
                buildQuery(entry.getValue(), entry.getKey(), queries);
            }
        }
    }
}

}

...