2015-12-12 115 views
2

我想要使用一個休息服務,併發布一些數據,使用Spring RestTemplatepostForObjectMethod但我得到一個空響應,儘管我可以看到請求並有效載荷的響應。Spring Resttemplate postforobject返回null作爲對象響應,如果與ClientHttpRequestInterceptor一起使用

[更新]我正在使用攔截器implmenting ClientHttpRequestInterceptor,如果我刪除它,我得到的響應。

[PS:服務配置爲POST,理想情況下它應該是GET,原因很明顯,但我仍然很好奇爲什麼沒有響應作爲帖子的一部分發布,即使我可以在http日誌中看到相同的內容。]

配置的Spring MVC 4基於應用

應用程序上下文:

<bean id="restTemplate" class="org.springframework.web.client.RestTemplate"> 
     <property name="messageConverters"> 
      <list> 
       <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/> 
      </list> 
     </property> 
     <property name="interceptors"> 
      <list> 
       <bean class="com.sipl.interceptors.LoggingRequestInterceptor" /> 
      </list> 
     </property> 
</bean> 

傑克遜POM

<dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-core</artifactId> 
     <version>${jackson.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-annotations</artifactId> 
     <version>${jackson.version}</version> 
    </dependency> 


    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-databind</artifactId> 
     <version>${jackson.version}</version> 
    </dependency> 

攔截器類

public class LoggingRequestInterceptor implements ClientHttpRequestInterceptor { 

    final static Logger logger = LoggerFactory.getLogger(LoggingRequestInterceptor.class); 

    @Override 
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { 

     traceRequest(request, body); 
     ClientHttpResponse response = execution.execute(request, body); 
     traceResponse(response); 
     return response; 
    } 

    private void traceRequest(HttpRequest request, byte[] body) throws IOException { 
     logger.debug("===========================request begin================================================"); 

     logger.debug("URI : " + request.getURI()); 
     logger.debug("Method : " + request.getMethod()); 
     logger.debug("Request Body : " + new String(body, "UTF-8")); 
     logger.debug("==========================request end================================================"); 
    } 

    private void traceResponse(ClientHttpResponse response) throws IOException { 
     StringBuilder inputStringBuilder = new StringBuilder(); 
     BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response.getBody(), "UTF-8")); 
     String line = bufferedReader.readLine(); 
     while (line != null) { 
      inputStringBuilder.append(line); 
      inputStringBuilder.append('\n'); 
      line = bufferedReader.readLine(); 
     } 
     logger.debug("============================response begin=========================================="); 
     logger.debug("status code: " + response.getStatusCode()); 
     logger.debug("status text: " + response.getStatusText()); 
     logger.debug("Response Body : " + inputStringBuilder.toString()); 
     logger.debug("=======================response end================================================="); 
    } 

} 

GetAllEmployeesClass

public class GetAllEmployeesVO { 
    private ResponseVO response; 
    private List<EmployeeBean> employees; 
    private String actionCode; 

    public String getActionCode() { 
     return actionCode; 
    } 

    public void setActionCode(String actionCode) { 
     this.actionCode = actionCode; 
    } 

    public ResponseVO getResponse() { 
     return response; 
    } 

    public void setResponse(ResponseVO response) { 
     this.response = response; 
    } 

    public List<EmployeeBean> getEmployees() { 
     return employees; 
    } 

    public void setEmployees(List<EmployeeBean> employees) { 
     this.employees = employees; 
    } 
} 

控制器

@RestController 
public class RestAdminstrationController { 
    @Autowired 
    private RestTemplate restTemplate; 
    @Value("${rest.getallemployees.api.endpoint}") 
    private String getEmpEndpt; 

    @RequestMapping(value = AppConstatants.GET_EXISTING_APP_USERS, method = RequestMethod.POST) 

    public List<EmployeeBean> loadAppAdminUsers(@RequestBody GetAllEmployeesVO userData) { 

     try { 
      //get Rest Service Data 
      GetAllEmployeesVO resp= restTemplate.postForObject(getEmpEndpt,userData,GetAllEmployeesVO.class); 
      //resp is coming as null 

請求響應HTTP有效載荷日誌:

2015-12-12 15:45:53 DEBUG RestTemplate:79 - Created POST request for "http://103.35.123.23:8080/siplrestservices/sipl/EmployeeService/getAllEmployees" 
2015-12-12 15:45:53 DEBUG RestTemplate:720 - Setting request Accept header to [application/json, application/*+json] 
2015-12-12 15:45:53 DEBUG RestTemplate:797 - Writing [com.sipl.common.beans.GetAllEmploye[email protected]] using [org.springfr[email protected]52e7339f] 
2015-12-12 15:45:53 DEBUG LoggingRequestInterceptor:36 - ===========================request begin================================================ 
2015-12-12 15:45:53 DEBUG LoggingRequestInterceptor:38 - URI : http://xxxxx:8080/siplrestservices/sipl/EmployeeService/getAllEmployees 
2015-12-12 15:45:53 DEBUG LoggingRequestInterceptor:39 - Method : POST 
2015-12-12 15:45:53 DEBUG LoggingRequestInterceptor:40 - Request Body : {"response":null,"employees":null,"actionCode":"M"} 
2015-12-12 15:45:53 DEBUG LoggingRequestInterceptor:41 - ==========================request end================================================ 
2015-12-12 15:45:54 DEBUG LoggingRequestInterceptor:53 - ============================response begin========================================== 
2015-12-12 15:45:54 DEBUG LoggingRequestInterceptor:54 - status code: 201 
2015-12-12 15:45:54 DEBUG LoggingRequestInterceptor:55 - status text: Created 
2015-12-12 15:45:54 DEBUG LoggingRequestInterceptor:56 - **Response Body : {"employees":[{"commonName":"MOHAN KUMAR GHOSHAL","countryCode":"","dateOfJoining":"2015-11-23","designationId":"4","division":"GENERAL","emailId":"","employeeId":"1","employeeNo":"M-392","employeeStatus":"1","hqCityId":"2","lastWorkingDate":"2015-11-23","mobile":{"mobileStatus":"1"},"mobileNo":"1234567890"}],"response":{"respCd":"0","respDesc":"SUCCESS"}}** 

2015-12-12 15:45:54 DEBUG LoggingRequestInterceptor:57 - =======================response end================================================= 
2015-12-12 15:45:54 DEBUG RestTemplate:632 - POST request for "http://xxxxx:8080/siplrestservices/sipl/EmployeeService/getAllEmployees" resulted in 201 (Created) 
+0

您只能讀取一次響應,您已經在攔截器中讀取並處理它,因此沒有任何處理了。你將不得不包裝輸入流,點擊它/複製它,以便它可以再次讀取。您至少必須「重置」輸入流,並根據您使用的可能工作的實現。 –

回答

5

您可以使用BufferingClientHttpRequestFactory。 它允許多次讀取響應。

+1

完美,我試過這個,它工作。謝謝。 – user1697113

1

正如Nati所建議的,我對我的休息模板進行了以下更改,它的工作方式與魅力相似。

<bean id="SimpleClientHttpRequestFactory" class="org.springframework.http.client.SimpleClientHttpRequestFactory"/> 
<bean id="BufferingClientHttpRequestFactory" class="org.springframework.http.client.BufferingClientHttpRequestFactory"> 
    <constructor-arg ref="SimpleClientHttpRequestFactory"/> 
</bean> 

<bean id="restTemplate" class="org.springframework.web.client.RestTemplate"> 
    <constructor-arg ref="BufferingClientHttpRequestFactory"/> 
    <property name="messageConverters"> 
     <list> 
      <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/> 
     </list> 
    </property> 
    <property name="interceptors"> 
     <list> 
      <bean class="com.sipl.interceptors.LoggingRequestInterceptor" /> 
     </list> 
    </property> 
</bean> 
+0

謝謝你的細節。 –

相關問題