Spring Resttemplate postforobject returns 如果与 ClientHttpRequestInterceptor 一起使用,则 null 作为对象响应
Spring Resttemplate postforobject returns null as object response if used with ClientHttpRequestInterceptor
我正在尝试使用休息服务,我正在 post 使用 Spring RestTemplate
postForObjectMethod
收集一些数据,但我得到的响应为空,即使虽然我可以在有效载荷中看到请求和响应。
[更新] 我正在使用拦截器实现 ClientHttpRequestInterceptor
,如果我删除它,我会收到响应。
[PS:服务配置为 POST,理想情况下应该是 GET,原因很明显,但我仍然很好奇为什么没有响应作为 post 的一部分,即使我在 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>
拦截器Class
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.GetAllEmployeesVO@1dd42575] using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@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)
您可以使用 BufferingClientHttpRequestFactory。
它允许多次读取响应。
按照 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>
我正在尝试使用休息服务,我正在 post 使用 Spring RestTemplate
postForObjectMethod
收集一些数据,但我得到的响应为空,即使虽然我可以在有效载荷中看到请求和响应。
[更新] 我正在使用拦截器实现 ClientHttpRequestInterceptor
,如果我删除它,我会收到响应。
[PS:服务配置为 POST,理想情况下应该是 GET,原因很明显,但我仍然很好奇为什么没有响应作为 post 的一部分,即使我在 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>
拦截器Class
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.GetAllEmployeesVO@1dd42575] using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@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)
您可以使用 BufferingClientHttpRequestFactory。 它允许多次读取响应。
按照 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>