복붙노트

[SPRING] Spring에서 RestTemplate 사용하기. 예외 - 확장 할 수있는 변수가 충분하지 않습니다.

SPRING

Spring에서 RestTemplate 사용하기. 예외 - 확장 할 수있는 변수가 충분하지 않습니다.

API의 내용에 액세스하려고하고 있으며 RestTemplate을 사용하여 URL을 보내야합니다.

String url1 = "http://api.example.com/Search?key=52ddafbe3ee659bad97fcce7c53592916a6bfd73&term=&limit=100&sort={\"price\":\"desc\"}";

OutputPage page = restTemplate.getForObject(url1, OutputPage .class);

그러나 다음과 같은 오류가 발생합니다.

Exception in thread "main" java.lang.IllegalArgumentException: Not enough variable values available to expand '"price"'
at org.springframework.web.util.UriComponents$VarArgsTemplateVariables.getValue(UriComponents.java:284)
at org.springframework.web.util.UriComponents.expandUriComponent(UriComponents.java:220)
at org.springframework.web.util.HierarchicalUriComponents.expandInternal(HierarchicalUriComponents.java:317)
at org.springframework.web.util.HierarchicalUriComponents.expandInternal(HierarchicalUriComponents.java:46)
at org.springframework.web.util.UriComponents.expand(UriComponents.java:162)
at org.springframework.web.util.UriTemplate.expand(UriTemplate.java:119)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:501)
at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:239)
at hello.Application.main(Application.java:26)

정렬 기준을 제거하면 제대로 작동합니다. 정렬 기준을 사용하여 JSON을 구문 분석해야합니다. 어떤 도움을 많이 주시면 감사하겠습니다.

감사

해결법

  1. ==============================

    1.근본적인 원인은 RestTemplate이 주어진 URL에서 중괄호 {...}를 URI 변수의 자리 표시 자라고 간주하고 이름을 기반으로 대체하려고 시도한다는 것입니다. 예를 들어

    근본적인 원인은 RestTemplate이 주어진 URL에서 중괄호 {...}를 URI 변수의 자리 표시 자라고 간주하고 이름을 기반으로 대체하려고 시도한다는 것입니다. 예를 들어

    {pageSize}
    

    pageSize라는 URI 변수를 얻으려고합니다. 이 URI 변수는 다른 오버로드 된 getForObject 메소드 중 일부로 지정됩니다. 아무 것도 제공하지 않았지만 URL에 URL이 필요하므로 예외가 발생합니다.

    한 가지 해결책은 값을 포함하는 String 객체를 만드는 것입니다.

    String sort = "{\"price\":\"desc\"}";
    

    URL에 실제 URI 변수를 제공합니다.

    String url1 = "http://api.example.com/Search?key=52ddafbe3ee659bad97fcce7c53592916a6bfd73&term=&limit=100&sort={sort}";
    

    getForObject ()를 그렇게 호출하면

    OutputPage page = restTemplate.getForObject(url1, OutputPage.class, sort);
    

    GET 요청의 요청 매개 변수에 JSON을 보내지 말고 POST 요청의 본문에서 JSON을 전송하는 것이 좋습니다.

  2. ==============================

    2.매개 변수 값을 URL 인코딩 할 수 있습니다.

    매개 변수 값을 URL 인코딩 할 수 있습니다.

    String url1 = "http://api.example.com/Search?key=52ddafbe3ee659bad97fcce7c53592916a6bfd73&term=&limit=100&sort=";
    
    org.apache.commons.codec.net.URLCodec codec = new org.apache.commons.codec.net.URLCodec();
    url1 = url1 + codec.encode("{\"price\":\"desc\"}");
    OutputPage page = restTemplate.getForObject(url1, OutputPage.class);
    
  3. ==============================

    3.sotirios-delimanolis가 제안한 솔루션이 시나리오에서 구현하기가 약간 어려우며 중괄호와 다른 문자가 포함 된 URI 문자열이 올바른 것으로 보장되면 인코딩 된 URI 문자열을 RestTemplate의 메서드에 전달하는 것이 더 간단 할 수 있습니다 ReST 서버를 쳤다.

    sotirios-delimanolis가 제안한 솔루션이 시나리오에서 구현하기가 약간 어려우며 중괄호와 다른 문자가 포함 된 URI 문자열이 올바른 것으로 보장되면 인코딩 된 URI 문자열을 RestTemplate의 메서드에 전달하는 것이 더 간단 할 수 있습니다 ReST 서버를 쳤다.

    UriComponentsBuilder.build ()를 사용하여 UriComponents.encode ()를 사용하여 인코딩하고 다음과 같이 RestTemplate.exchange ()를 사용하여 URI 문자열을 작성할 수 있습니다.

    public ResponseEntity<Object> requestRestServer()
    {
        HttpEntity<?> entity = new HttpEntity<>(requestHeaders);
        UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(rawValidUrl)
                .queryParams(
                        (LinkedMultiValueMap<String, String>) allRequestParams);
        UriComponents uriComponents = builder.build().encode();
        ResponseEntity<Object> responseEntity = restTemplate.exchange(uriComponents.toUri(), HttpMethod.GET,
                entity, String.class);
        return responseEntity;
    }
    

    위의 코드 스 니펫에서는 URI를 작성, 인코딩 및 추출하는 작업이 명확하게하기 위해 분리되었습니다.

  4. ==============================

    4.단순히 변수를 URL에 추가하고 restTemplate.postForObject 메소드에 변수 값을 전달할 수 있습니다.

    단순히 변수를 URL에 추가하고 restTemplate.postForObject 메소드에 변수 값을 전달할 수 있습니다.

    String url1 = "http://api.example.com/Search? 
    key=52ddafbe3ee659bad97fcce7c53592916a6bfd73&term=&limit=100&sort={data}";
    String data="{\"price\":\"desc\"}";
    OutputPage page = restTemplate.getForObject(url1, OutputPage.class, data);
    
  5. from https://stackoverflow.com/questions/21819210/using-resttemplate-in-spring-exception-not-enough-variables-available-to-expan by cc-by-sa and MIT license