我有以下方法在方法完成之前向浏览器返回不正确的响应。这是在春季3.2。
@RequestMapping(value="/process1/createEditContract/validate", method=RequestMethod.POST)
public @ResponseBody StatusResponse validateProcess1(@ModelAttribute("contractEditForm") @Valid Process1CreateEditContractDTO dto, BindingResult bindingResult) {
StatusResponse response = new StatusResponse();
response.setSuccess(true);
if (bindingResult.hasErrors()) {
log.debug("Errors found. Processing status response");
response.setSuccess(false);
List<FieldError> fieldErrors = bindingResult.getFieldErrors();
for (FieldError fe: fieldErrors) {
response.getMessages().add(messageSource.getMessage(fe, null));
}
}
return response;
}
StatusResponse是一个简单的对象,JSP中的javascript函数会读取该对象以生成Javascript警报,指出操作是成功还是发生错误。该方法一直贯穿始终,但只要它尝试编写响应,我就会得到:
java.net.SocketException: Software caused connection abort: socket write error
我已经被困了一天了,任何帮助都会受到赞赏。
更新
我从Spring 3.2回滚到Spring 3.1,错误信息的措辞已经改变,足以给我更多信息。
基本上,我现在看到了这个:
IllegalStateException: Response already committed
我看不到的是导致响应如此迅速地提交的原因。可能与OpenSessionInViewFilter冲突?
答案 0 :(得分:0)
This error can occur when the local network system aborts a connection, such as when WinSock closes an established connection after data retransmission fails (receiver never acknowledges data sent on a datastream socket).". See this MSDN article. See also Some information about 'Software caused connection abort.
为了证明哪个组件出现故障,我将使用wireshark监控TCP / IP通信,并查看谁正在关闭端口,超时也可能是相关的。
答案 1 :(得分:0)
javascript在浏览器中运行,您的控制器在服务器上运行。您无法将复杂对象从控制器传递到javascript,而无需将其转换为文本格式,如xml或json。
所以你应该:
produces="application/json"
注释RequestMapping