java url resttemplate illegalargumentexception

java - IllegalArgumentException: ¿No hay suficientes valores de variables disponibles con RestTemplate?



url (2)

Estoy intentando ejecutar URL usando RestTemplate de esta manera:

public static void main(String[] args) throws UnsupportedEncodingException { RestTemplate restTemplate = new RestTemplate(); String url = "http://ptr.vip.host.com/pss/repositories/pssdb/branches/main/query/Service[@alias=" + "hello" + "].serviceInstances.runsOn{@resourceId}?allowScan=true&limit=10000&skip=0"; try { String response = restTemplate.getForObject(url, String.class); System.out.println(response); } catch (RestClientException ex) { ex.printStackTrace(); } }

Pero cada vez que recibo un error como este -

Exception in thread "main" java.lang.IllegalArgumentException: Not enough variable values available to expand ''@resourceId'' at org.springframework.web.util.UriComponents$VarArgsTemplateVariables.getValue(UriComponents.java:272)

¿Qué está mal que estoy haciendo y cómo solucionarlo?

Actualizar:-

Intenté con esta url también y no funcionó para mí. Acabo de reemplazar {@resourceId} con {{@resourceId}}

String url = "http://ptr.vip.host.com/pss/repositories/pssdb/branches/main/query/Service[@alias=" + "hello" + "].serviceInstances.runsOn{{@resourceId}}?allowScan=true&limit=10000&skip=0";

Actualización-2

Aquí está el código -

try { UriComponentsBuilder builder = UriComponentsBuilder .fromPath("http://ptr.vip.str.host.com/pss/repositories/pssdb/branches/main/query/Service[@alias=" + "hello" + "].serviceInstances.runsOn{@resourceId}?allowScan=true&limit=10000&skip=0"); UriComponents uriComponents = builder.build(); URI uri = uriComponents.toUri(); String response = restTemplate.getForObject(uri, String.class); System.out.println(response); } catch (RestClientException ex) { ex.printStackTrace(); }

Y el error es -

Exception in thread "main" java.lang.IllegalArgumentException: URI is not absolute at java.net.URI.toURL(URI.java:1095) at org.springframework.http.client.SimpleClientHttpRequestFactory.createRequest(SimpleClientHttpRequestFactory.java:109) at org.springframework.http.client.support.HttpAccessor.createRequest(HttpAccessor.java:76) at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:479) at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:460) at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:228)


Deberías ver el soucre de RestTemplate. El método de getForObject necesita tres parámetros, como

public <T> T getForObject(String url, Class<T> responseType, Object... urlVariables)

El ''url'' es la parte del prefijo de url (delante de ''?'') Y ''urlVariables'' es una matriz de parámetros.


No parece que RestTemplate tenga un medio de ignorar {...} . En su lugar, genere un URI partir de su valor String (sin el doble {} ).

String url = "http://ptr.vip.host.com/pss/repositories/pssdb/branches/main/query/Service[@alias=" + "hello" + "].serviceInstances.runsOn{@resourceId}?allowScan=true&limit=10000&skip=0"; UriComponentsBuilder builder = UriComponentsBuilder.fromPath(url); UriComponents uriComponents = builder.build(); URI uri = uriComponents.toUri();

y use el método getForObject sobrecargado que toma un URI .