Java Spring Ajax-@ResponseBody-返回空响应
在我的SpringWebApp中,我有一个回答json的ajax servlet(使用jackson): 当用户登录时,它会返回如下内容: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响应(另外还有一个错误的内容类型头) 为什么会发生这种情况? 我是否有获得预期行为的解决
{ 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();
}
}
}