在Spring MVC中,如何在使用@ResponseBody时设置哑剧类型标头

2022-08-31 12:59:35

我有一个返回JSON字符串的Spring MVC控制器,我想将mimetype设置为appplication/json。我该怎么做?

@RequestMapping(method=RequestMethod.GET, value="foo/bar")
@ResponseBody
public String fooBar(){
    return myService.getJson();
}

业务对象已经可以作为 JSON 字符串使用,因此使用不是我的解决方案。 是完美的,但我如何设置哑剧类型?MappingJacksonJsonView@ResponseBody


答案 1

请代替 使用 。这样,您就可以访问响应标头,并且可以设置适当的内容类型。根据春季文档ResponseEntityResponseBody

类似于 和 。除了访问请求和响应正文(以及特定于响应的子类)还允许访问请求和响应标头HttpEntity@RequestBody@ResponseBodyHttpEntityResponseEntity

代码将如下所示:

@RequestMapping(method=RequestMethod.GET, value="/fooBar")
public ResponseEntity<String> fooBar2() {
    String json = "jsonResponse";
    HttpHeaders responseHeaders = new HttpHeaders();
    responseHeaders.setContentType(MediaType.APPLICATION_JSON);
    return new ResponseEntity<String>(json, responseHeaders, HttpStatus.CREATED);
}

答案 2

我会考虑重构服务以返回您的域对象而不是JSON字符串,并让Spring处理序列化(通过您编写的)。从Spring 3.1开始,实现看起来非常整洁:MappingJacksonHttpMessageConverter

@RequestMapping(produces = MediaType.APPLICATION_JSON_VALUE, 
    method = RequestMethod.GET
    value = "/foo/bar")
@ResponseBody
public Bar fooBar(){
    return myService.getBar();
}

评论:

首先,必须将 或 添加到应用程序配置中。<mvc:annotation-driven />@EnableWebMvc

接下来,使用批注的 produce 属性指定响应的内容类型。因此,应将其设置为 MediaType.APPLICATION_JSON_VALUE(或 )。@RequestMapping"application/json"

最后,必须添加 Jackson,以便 Spring 自动处理 Java 和 JSON 之间的任何序列化和反序列化(Jackson 依赖项由 Spring 检测到,并且将在引擎盖下)。MappingJacksonHttpMessageConverter