2014-09-12 4 views
2

나는 아주 간단한 컨트롤러를 가지고 HTTP 요청을 만들고 HATEOAS 형식의 리소스를 받는다.Spring HATEOAS를 적절한 객체로 변환하는 방법

package com.provider.spring.controller; 

import java.util.List; 

import org.springframework.hateoas.Link; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.client.RestTemplate; 

import com.fasterxml.jackson.databind.ObjectMapper; 
import com.provider.employee.EmployeeDTO; 
import com.provider.http.HttpComponentsClientHttpRequestFactoryBasicAuth; 
import com.provider.spring.rest.Resource; 

@Controller 
public class EmployeeController { 

    private static final String REL_SELF = "self"; 
    private static final String REL_SEARCH = "search"; 
    private static final String REL_EMPLOYEE = "employee"; 
    private static final String RESOURCE_URI = "http://localhost:8080/employees"; 

    private RestTemplate restTemplate = new RestTemplate(new HttpComponentsClientHttpRequestFactoryBasicAuth("user", "password")); 
    private List<EmployeeDTO> employees; 


    @RequestMapping("/employees") 
    public String getAllEmployees() { 

     String result = null; 
     try { 
      String resultBody = restTemplate.getForObject(RESOURCE_URI, String.class); 
      ObjectMapper objectMapper = new ObjectMapper(); 
      Resource<EmployeeDTO> resource = objectMapper.readValue(resultBody, Resource.class); 

      // Get objects with relation "employee" 
      for(Link l : resource.getLinks()) { 
       if(l.getRel().equals(REL_EMPLOYEE)) { 
        // TODO: Construct EmployeeDTO from Link. 
        // TODO: Add EmployeeDTO to list. 
       } 
      } 
     } 
     catch(Exception e) { 
      e.printStackTrace(); 
      result = "error"; 
      return result; 
     } 
     return result; 
    } 
} 

개체를 개체로 변환하는 기존의 기본 방법이 있습니까?

는 EmployeeDTO에 대한 자세한 내용은 여기를 참조하십시오 : 당신은 RestTemplate의 생성자의 일부 MessageConverters를 등록하거나 setMessageConverters을 사용할 수 있습니다 https://gist.github.com/Xerosigma/64469a30355f5de0228a

+1

EmployeeDTO 클래스를 볼 수 있습니까? 우리가 인스턴스화하려고하는 대상 클래스를 보는 것이 도움이 될 것입니다. –

+0

예! 여기에는 요점이 있으며, 불행히도 실패한 시도가 포함 된 최신 컨트롤러를 포함 시켰습니다. https://gist.github.com/Xerosigma/64469a30355f5de0228a –

답변

3

몇 가지 방법 :

사용자 정의 변환없이 : 사용자 정의 변환기

ObjectMapper objectMapper = new ObjectMapper(); 
objectMapper.registerModule(new Jackson2HalModule()); 
RestTemplate restTemplate= new RestTemplate(); 

String resultBody = restTemplate.getForObject(link.getHref(), String.class); 
EmployeeDTO resource = objectMapper.readValue(resultBody, EmployeeDTO.class); 

:

다음

은 예입니다
ObjectMapper objectMapper = new ObjectMapper(); 
objectMapper.registerModule(new Jackson2HalModule()); 
RestTemplate restTemplate= new RestTemplate(); 

MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); 
converter.setObjectMapper(objectMapper); 
restTemplate.setMessageConverters(Collections.<HttpMessageConverter<?>> singletonList(converter)); 
EmployeeDTO resource = restTemplate.getForObject(link.getHref(), EmployeeDTO.class); 
+0

두 번째 옵션 (사용자 지정 변환기 사용)을 시도했지만 EmployeeDTO 개체의 변수가 모두 null입니다. 내가 널이 된 이유를 아십니까? 미리 감사드립니다. – mona

+0

@mona 내가 볼 수 있도록 모든 관련 수업의 요지를 작성할 수 있습니까? 감사. –

+1

@mona 정확히 같은 시나리오가 나타납니다. 그 요점을 만들었 니? –

-1

. 둘 다 HttpMessageConverters 목록을 매개 변수로 사용합니다. 이와 같이 구성한 경우 교환 또는 getForObject-method를 예상 자원 유형과 함께 사용할 수 있습니다. RestTemplate은 모든 변환기를 실행하고 json/xml/...을 개체로 변환 할 수 있는지 확인합니다. 잭슨이 작업을 수행 할 수

List<HttpMessageConverter<?>> converters = new LinkedList<>(); 
converters.add(new MappingJacksonHttpMessageConverter()); 
RestTemplate template = new RestTemplate(converters); 
// or use the set method 
template.setMessageConverters(converters); 
// make url call 
Resource<EmployeeDTO> resource = template.getForObject("url", Resource.class);