복붙노트

[SPRING] List 또는 String 배열을 Spring RestTemplate을 사용하여 getForObject에 전달하는 방법

SPRING

List 또는 String 배열을 Spring RestTemplate을 사용하여 getForObject에 전달하는 방법

나는 봄과 함께 편안한 서비스를 개발 중이다. 내 서비스 컨트롤러에 매개 변수로 문자열 배열 또는 큰 문자열을 전달 / 가져 오는 데 문제가 있습니다. 내 코드 예제는 아래와 같다.

제어 장치:

@RequestMapping(value="/getLocationInformations/{pointList}", method=RequestMethod.GET)
@ResponseBody
public LocationInfoObject getLocationInformations(@PathVariable("pointList") String pointList)
{
    // code block
}

샘플 포인트 목록 :

String pointList = "37.0433;35.2663,37.0431;35.2663,37.0429;35.2664,37.0428;35.2664,37.0426;35.2665,37.0424;35.2667,37.0422;35.2669,37.042;35.2671,37.0419;35.2673,37.0417;35.2674,37.0415;35.2674,37.0412;35.2672,37.0408;35.267,37.04;35.2667,37.0396;35.2665,37.0391;35.2663,37.0388;35.2662,37.0384;35.266,37.0381;35.2659,37.0379;35.2658,37.0377;35.2657,37.0404;35.2668,37.0377;35.2656,37.0378;35.2652,37.0378;35.2652,37.0381;35.2646,37.0382;35.264,37.0381;35.2635,37.038;35.263,37.0379;35.2627,37.0378;35.2626,37.0376;35.2626,37.0372;35.2627,37.0367;35.2628,37.0363;35.2628,37.036;35.2629,37.0357;35.2629,37.0356;35.2628,37.0356;35.2628,37.0355;35.2626";

웹 서비스 고객 코드 :

Map<String, String> vars = new HashMap<String, String>();
vars.put("pointList", pointList);

String apiUrl = "http://api.website.com/service/getLocationInformations/{pointList}";

RestTemplate restTemplate = new RestTemplate();
LocationInfoObject result = restTemplate.getForObject(apiUrl, LocationInfoObject.class, vars);

클라이언트 쪽 응용 프로그램을 실행할 때 HttpClientErrorException throw합니다 : 400 잘못된 요청, 긴 위치 정보 문자열이이 문제를 일으키는 것 같아요. 그렇다면이 문제를 어떻게 해결할 수 있습니까? 또는 웹 서비스에 매개 변수로 긴 문자열 값을 게시 할 수 있습니까?

모두들

해결법

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

    1.List 또는 다른 유형의 객체는 RestTemplate의 postForObject 메소드로 게시 할 수 있습니다. 내 솔루션은 아래와 같습니다.

    List 또는 다른 유형의 객체는 RestTemplate의 postForObject 메소드로 게시 할 수 있습니다. 내 솔루션은 아래와 같습니다.

    제어 장치:

    @RequestMapping(value="/getLocationInformations", method=RequestMethod.POST)
    @ResponseBody
    public LocationInfoObject getLocationInformations(@RequestBody RequestObject requestObject)
    {
        // code block
    }
    

    서비스에 게시 할 요청 개체를 만듭니다.

    public class RequestObject implements Serializable
    {
        public List<Point> pointList    = null;
    }
    
    public class Point 
    {
        public Float latitude = null;
        public Float longitude = null;
    }
    

    응답 객체를 만들어 서비스에서 값을 가져옵니다.

    public class ResponseObject implements Serializable
    {
        public Boolean success                  = false;
        public Integer statusCode               = null;
        public String status                    = null;
        public LocationInfoObject locationInfo  = null;
    }
    

    요청 객체를 가진 포스트 포인트 목록과 서비스로부터 응답 객체 얻기 :

    String apiUrl = "http://api.website.com/service/getLocationInformations";
    RequestObject requestObject = new RequestObject();
    // create pointList and add to requestObject
    requestObject.setPointList(pointList);
    
    RestTemplate restTemplate = new RestTemplate();
    ResponseObject response = restTemplate.postForObject(apiUrl, requestObject, ResponseObject.class);
    
    // response.getSuccess(), response.getStatusCode(), response.getStatus(), response.getLocationInfo() can be used
    
  2. ==============================

    2.먼저 매개 변수로 맵을 전달했지만 컨트롤러가이를 경로 변수로 간주합니다. 'pointlist'값을 URL의 일부 (중괄호 자리 표시 자 없음)로 만드는 것만으로하면됩니다. 예 :

    먼저 매개 변수로 맵을 전달했지만 컨트롤러가이를 경로 변수로 간주합니다. 'pointlist'값을 URL의 일부 (중괄호 자리 표시 자 없음)로 만드는 것만으로하면됩니다. 예 :

    http://api.website.com/service/getLocationInformations/pointList
    

    다음으로 위치 정보 객체가 적절한 표현 (JSON 제안)으로 정렬되고 같은 방식으로 정렬되도록 메시지 변환기를 설정해야합니다.

    나머지 템플리트의 경우 :

    restTemplate.setMessageConverters(...Google MappingJackson2HttpMessageConverter...);
    

    서버의 경우 classpath에 Jackson을 추가하기 만하면됩니다. 여러 개의 표현을 수동으로 구성해야하는 경우 Google이 여기에 친구가됩니다.

  3. from https://stackoverflow.com/questions/22507129/how-to-pass-list-or-string-array-to-getforobject-with-spring-resttemplate by cc-by-sa and MIT license