Остановить расширение URITemplate при использовании Spring RESTTemplate

Я использую Spring RestTemplate для вызова индекса Apache Solr. Я формирую строку запроса вручную и не предоставляю никаких преднамеренных переменных раскрытия шаблона {variable_name}. Частью запроса является термин {! Lucene q.op=OR}. К сожалению, это обрабатывается механизмом URITemplate как часть вызова restTemplate.getForObject.

В идеале я хотел бы остановить эту обработку. Можно ли экранировать символы { }, чтобы URITemplate не обрабатывал их? Я пытался кодировать символы, но RestTemplate предполагает некодированную строку, поэтому они кодируются дважды и вызывают запрос 400: Bad на серверной части.

Пример URL:

http://localhost/solr/select?q={! lucene q.op = OR} se_genbanklocus: * se_gb_create: * se_gb_update: * se_clone_name: * se_sample_tissue: * & facet = true & facet.limit = 3 & facet.mincount = 1 & facet.mincount = 1 & facet.min. se_sample_tissue&facet.field=se_sample_tissue_name&facet.field=se_sample_tissue_code&facet.field=se_sample_tissue_class&facet.field=se_nuc_acid_type&facet.field=ssam_sample_georegion& начать =0& =10 строк

3 ответа

Решение

Проблема в том, что вы используете RestTemplate для чего-то, для чего он не предназначен. Пример URL, который вы дали, не является URL-адресом в стиле REST, это просто масса параметров запроса, использующих закодированные символы, которые вы не найдете в схеме REST, поэтому возникают трудности с нежелательными заменами.

Я нашел обходной путь, в котором я могу использовать шаблон, чтобы раскрыть одну переменную, которая содержит оскорбительные {!lucene q.op=OR}

restTemplate.getForObject(solrServer+"select?{query}" , String.class, requestString );

Как насчет использования перегруженного метода, который принимает URI?

Другие вопросы по тегам