2016-02-28 59 views
0

这是我的休息控制器(服务器):REST客户端与Spring RestTemplate和自定义对象的输入参数

@RestController 
public class RemoteController { 

    @RequestMapping(value="/test", method=RequestMethod.GET) 
    public Return serverTest(HttpServletRequest req, SearchFilter search) throws Exception{ 
     //... 
     return new OutputTest(); 
    } 
} 

我想写相应的客户端与SearchFilter对象作为输入这个GET控制器。

public void clientTest(){ 
     SearchFilter input=new SearchFilter(); 
     RestTemplate restTemplate = new RestTemplate(); 
     HttpHeaders headers = new HttpHeaders(); 
     headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON)); 
     HttpEntity<String> entity = input;// how to store SearchFilter input ?????? 
     ResponseEntity<OutputTest> response=restTemplate.exchange("http://localhost:8080/test", HttpMethod.GET, entity, OutputTest.class); 
     OutputTest out=response.getBody(); 
} 

如何发送单个对象到restTemplate?

回答

1

你应该告诉Spring如何将请求参数绑定到SearchFilter。有多种技术途径实现这一目标,最简单的解决方案是使用ModelAttribute注释:

@RequestMapping(value="/test", method=RequestMethod.GET) 
public Return serverTest(HttpServletRequest req, @ModelAttribute SearchFilter search) throws Exception{ 
    //... 
    return new OutputTest(); 
} 

假设你的SearchFilter看起来是这样的:

public class SearchFilter { 
    private String query; 
    // other filters and getters and setters 
} 

如果你开除到/test?query=something的请求时,SearchFilter会填充发送的查询参数。为了与RestTemplate了这个要求:

RestTemplate template = new RestTemplate(); 

// prepare headers 
HttpHeaders headers = new HttpHeaders(); 
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); 

// request without body, just headers 
HttpEntity<Object> request = new HttpEntity<>(headers); 

ResponseEntity<OutputTest> response = template.exchange("http://localhost:8080/test?query=something", 
      HttpMethod.GET, 
      request, 
      OutputTest.class); 

另一种方法我能想到的,是实现HandlerMethodArgumentResolver解决SearchFilter参数。此外,您可以拆分SearchFilter并使用多个RequestParam s。

+0

使用此代码我从RestController得到了“org.springframework.http.converter.HttpMessageNotReadableException:所需的请求正文缺失” – Tobia

+0

似乎GET必须是无身体的,它可能吗?将其转换为POST方法,它的工作原理!无论如何,我必须使用过滤器对象来处理这个读取请求,我应该怎么做才能遵循休息规定? – Tobia

+0

您应该告诉spring将请求参数绑定到'SearchFilter'中。最简单的解决方案是使用'ModelAttribute'注释。有一刻,我以为你正在发送POST请求 –