【问题标题】:comment out json before send to client在发送给客户端之前注释掉 json
【发布时间】:2010-12-05 14:52:07
【问题描述】:

在 Spring 3 控制器中

@RequestMapping(value = "/employee/{id}", RequestMethod.GET)
public @ResponseBody Employee getEmployee(@PathVariable long empID) {
    Employee employee = employeeService.getByID(empID);
    return employee;
}

我应该修改哪个文件,这样 json 就会像下面这样返回

而不是返回"['foo', 'bar']"

返回这个"/*['foo', 'bar']*/"(带评论)?

【问题讨论】:

  • 这个的用例是什么?
  • @skaffman,你的意思是这样做的原因是什么?转到此处tinyurl.com/mq96sh,请参阅标题“保护您的单站点应用程序”

标签: java spring rest jackson


【解决方案1】:

在幕后,Spring MVC 委托HttpMessageConverter 来执行序列化。在这种情况下,Spring MVC 调用一个基于 Jackson JSON 处理器 构建的MappingJacksonHttpMessageConverter。当您使用 mvc:annotation-driven 配置元素和 Jackson 出现在您的类路径中时,此实现会自动启用。

因此,您可以通过覆盖提供自己的HttpMessageConverter 实现

protected void writeInternal(Object o,
                         HttpOutputMessage outputMessage)
                  throws IOException,
                         HttpMessageNotWritableException

MappingJacksonHttpMessageConverter的方法,可以达到目的。

【讨论】:

  • 是否可以使用spring拦截器postHandle来做到这一点?如果是,我应该为 postHandle 方法添加什么?如何从此方法中获取原始 json?
  • @cometta 我认为您无法修改已经刷新/提交的内容,因此仅使用 postHandle 将不是正确的解决方案。您也需要使用 preHandle。
【解决方案2】:

关于 cmets 的快速说明:cmets 不是(唉!)JSON 规范的一部分,因此使用它们意味着使用非标准 JSON。

对于它的价值,可以让一些 JSON 解析器(包括 Jackson)处理 cmets(对于 Jackson,请参阅 http://wiki.fasterxml.com/JacksonFeaturesParser);以及编写它们(需要使用'JsonGenerator.writeRaw("/.../")')。

但也许 Spring 有一种方法来装饰响应,因为这可能更容易实现。

【讨论】:

    猜你喜欢
    • 2022-11-04
    • 2013-02-08
    • 2020-02-29
    • 1970-01-01
    • 2010-10-03
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    相关资源
    最近更新 更多