Spring MVC在完成控制器方法之前返回响应

时间:2014-07-29 17:04:10

标签: spring-mvc

我有以下方法在方法完成之前向浏览器返回不正确的响应。这是在春季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冲突?

2 个答案:

答案 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。

所以你应该:

  • 选择一种格式(比如说json)
  • produces="application/json"注释
  • 中添加RequestMapping
  • 在控制器方法中生成json