Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring Ajax-@ResponseBody-返回空响应_Java_Ajax_Spring_Spring Mvc_Jackson - Fatal编程技术网

Java Spring Ajax-@ResponseBody-返回空响应

Java Spring Ajax-@ResponseBody-返回空响应,java,ajax,spring,spring-mvc,jackson,Java,Ajax,Spring,Spring Mvc,Jackson,在我的SpringWebApp中,我有一个回答json的ajax servlet(使用jackson): 当用户登录时,它会返回如下内容: { userName : "jojo", email : "john.doe@email.com", firstName : "John", lastName : "Doe" } 当用户未登录时,预期的行为是返回 null 但它返回一个空响应,该响应不是有效的JSON响应(另外还有一个错误的内容类型头) 为什么会发生这种情况? 我是否有获得预期行为的解决

在我的SpringWebApp中,我有一个回答json的ajax servlet(使用jackson):

当用户登录时,它会返回如下内容:

{ userName : "jojo", email : "john.doe@email.com", firstName : "John", lastName : "Doe" }
当用户未登录时,预期的行为是返回

null
但它返回一个空响应,该响应不是有效的JSON响应(另外还有一个错误的内容类型头)

为什么会发生这种情况?

我是否有获得预期行为的解决方案?

是否有会话筛选器

我认为,您可以为错误绑定一个全局ajax事件,并在那里进行相应的验证

下面是一个类似案例的示例:

当用户未登录时,预期的行为是返回null

这是我预期的行为,因为在Java和Javascript/JSON中,null是一个有效值,它的平均值与nothing、empty或error/exception不同。

我希望Spring回答空响应,而不是专门处理它。 在这种情况下,null(Java)的预期转换将是null(JSON)
我的预期转换表:

Java Exception => HTTP Error Code
null => null
empty map / object => {}
void => no response

为什么会这样

对于Spring,返回null的控制器意味着“无响应”,而不是“值为null的响应”。此规则适用于所有控制器方法,包括带有@ResponseBy注释的方法。
这允许手动写入响应,而无需在以后的响应中追加内容:

if (mySpecialCase) {
    Writer writer = response.getWriter();
    writer.write("my custom response");
    return null;
} else {
     return myObject;
}
因此,当返回null时,Spring不向响应写入任何内容,也不向内容类型标题或正文写入任何内容。

我是否有获得预期行为的解决方案

我犯了以下错误:在我的ajax路径上添加一个过滤器,当没有提交响应时,该过滤器会将null写入响应

public class AjaxEmptyResponseFilter implements Filter {

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        chain.doFilter(request, response);
        if (!response.isCommitted()) {
            response.setCharacterEncoding("UTF-8");
            response.setContentType("application/json");
            Writer writer = response.getWriter();
            writer.write("null");
            writer.close();
            response.flushBuffer();
        }
    }

}

此解决方案以相同的方式处理回答null的方法和不回答null的方法(void)。

如果您返回null对象,而不是返回字符串“null”,我认为空json将是正确的行为。返回的内容类型是什么?如果您试图遵循更RESTful的模式,最好的解决方案是返回适当的HTTP状态代码,如404(未找到)或401(未授权)。或者,更好的方法是将它们重定向/转发到登录页面。空json意味着我必须测试属性(例如:response.email)以了解用户是否为null。这就是为什么我认为返回null更合适、更连贯。我的问题并不是特别针对登录/会话管理。我想知道如何使用SpringAjax返回“null”(我的意思不是“无响应”,而是一个表示“无结果”的响应)。
if (mySpecialCase) {
    Writer writer = response.getWriter();
    writer.write("my custom response");
    return null;
} else {
     return myObject;
}
public class AjaxEmptyResponseFilter implements Filter {

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        chain.doFilter(request, response);
        if (!response.isCommitted()) {
            response.setCharacterEncoding("UTF-8");
            response.setContentType("application/json");
            Writer writer = response.getWriter();
            writer.write("null");
            writer.close();
            response.flushBuffer();
        }
    }

}