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
.