spring mvc restcontroller return json 字符串

spring mvc restcontroller return json string

我有一个 Spring MVC 控制器,方法如下:

@RequestMapping(value = "/stringtest", method = RequestMethod.GET)
public String simpletest() throws Exception {
    return "test";
}

它位于一个控制器内,启动方式如下:

@RestController
@RequestMapping(value = "/root")
public class RootController

当我调用 return 对象的其他方法时,这些对象被 Jackson 序列化为 JSON。但是这个returns一个String的方法并没有转换成JSON。如果不清楚,这里有一个使用 curl 的例子:

$curl http://localhost:8080/clapi/root/stringtest 
test

所以问题是没有任何引号的 "test" 不是 JSON 字符串,但我的 REST 客户端需要一个字符串。我希望 curl 命令显示带有引号的字符串,所以它是合法的 JSON 而不是:

"test"

我正在使用 Spring WebMVC 4.1.3 和 Jackson 2.4.3。我试过向 RequestMapping 添加一个 "produces" 属性,表示它应该 return JSON。在这种情况下,发回的 Content-Type 属性是 "application/json" 但测试字符串仍然没有被引用。

我可以通过调用 JSON 库将 Java 字符串转换为 JSON 来解决这个问题,但似乎 Spring MVC 和 Jackson 通常会自动执行此操作.然而不知何故,他们在我的案例中没有这样做。我可能配置错误的任何想法只是测试回来而不是 "test"?

尝试这样的事情

@RequestMapping(value = "/stringtest", method = RequestMethod.GET, produces="application/json")
public @ResponseBody String simpletest() throws Exception {
    return "test";
}

试试这个:

@RequestMapping(value = "/stringtest", method = RequestMethod.GET,produces = MediaType.APPLICATION_JSON_VALUE)

事实证明,当您使用 @EnableWebMvc 注释时,它会默认打开一堆 http 消息转换器。列表中的第二个是 StringHttpMessageConverter,文档说它将应用于 text/* 内容类型。但是,在使用调试器逐步完成后,它适用于 */* 内容类型的字符串对象 - 显然包括 application/json.

负责 application/json 内容类型的 MappingJackson2HttpMessageConverter 在此列表的下方。因此,对于 String 以外的 Java 个对象,将调用此对象。这就是为什么它适用于对象和数组类型,但不适用于字符串 - 尽管使用 produces 属性设置 application/json 内容类型的建议很好。尽管该内容类型是触发此转换器所必需的,但字符串转换器抢先了工作!

当我为其他一些配置扩展 WebMvcConfigurationSupport class 时,我覆盖了以下方法以将 Jackson 转换器放在第一位,因此当内容类型为 application/json 时,则此将使用一个代替字符串转换器:

@Override
protected void configureMessageConverters(
        List<HttpMessageConverter<?>> converters) {
    // put the jackson converter to the front of the list so that application/json content-type strings will be treated as JSON
    converters.add(new MappingJackson2HttpMessageConverter());
    // and probably needs a string converter too for text/plain content-type strings to be properly handled
    converters.add(new StringHttpMessageConverter());
}

现在,当我从 curl 调用测试方法时,我得到了所需的 "test" 输出,而不仅仅是 test,因此期望 JSON 的 angular 客户端是现在很开心。