我使用“Jsonitter”作为 JSON 序列化框架,并且在我的项目中没有使用 Maven。我一直在 Restful api 中通过直接将“Jsonitter”的结果写入到HttpServletResponse我发现该@RestController属性的方式来返回 JSON 对象。由于具有 ASP.Net MVC 背景,我希望框架能够根据标头自动序列化我的 api 中返回的对象Accept。但我觉得,Spring 需要第三方序列化框架来呈现结果(即 Jackson),因为它返回HTTP Status 406 - Not Acceptable结果。
我的使用方法如下:
@RestController
@EnableWebMvc
public class TestApi {
@RequestMapping(value = "Test", method = RequestMethod.Get, produces = "application/json")
public List<String> letsTest(){
return myStringList;
}
}
Run Code Online (Sandbox Code Playgroud)
我没有任何关于杰克逊的参考,我宁愿根本不使用它,我觉得错误就是由此造成的。如果没有杰克逊,有什么办法可以完成这项工作吗?
由于您的控制器被配置为仅在客户端请求数据时返回响应application/json,
produces = "application/json"
Run Code Online (Sandbox Code Playgroud)
您可能会收到“406 Not Acceptable”,因为您的客户端请求了其他内容/未指定任何 Accepts 标头。您可以通过以下方式修复:
Accepts标头*/*如果您很懒的话)。这是您唯一的问题,您不必在 Spring 中使用任何序列化框架(但是如果您定义控制器方法以返回任意 bean,则需要序列化程序)。您可以编写任何字符串作为对客户的响应。
如果您想继续使用 Jsoniter,但将其移至后台,以便您的 Controller 类不再显式提及 jsoniter,则您需要定义自己的自定义 HttpMessageConverter。
您需要一些序列化器来从 Java 生成 Json。您可以编写自定义代码,或者使用 Jackson 或 Gson。Spring默认支持Jackson,Gson则使用GsonHttpMessageConverter。对于 Jackson,您当前的代码没问题,但您需要添加 Jackson 依赖项。对于 Gson,您需要声明转换器,网上有一些资源对此进行了解释。
正如这个问题的答案Does spring mvc has response.write 直接输出到浏览器吗?
您可以使用 来编写您的回复@ResponseBody。由于@RestController已经暗示了@ResponseBody,您也可以将其省略。在这里显示它只是为了澄清:
@ResponseBody // not needed with @RestController
@RequestMapping(value = "Test", method = RequestMethod.Get, produces = "application/json")
public String letsTest() {
// Using Jsoniter JsonStream
return JsonStream.serialize(myStringList);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16569 次 |
| 最近记录: |