spring mvc restcontroller返回json字符串

我有一个使用以下方法的Spring MVC控制器:

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

public String simpletest() throws Exception {

return "test";

}

它位于一个像这样启动的控制器内:

@RestController

@RequestMapping(value = "/root")

public class RootController

当我调用其他返回对象的方法时,Jackson将这些对象序列化为JSON。但是此返回String的方法不会转换为JSON。如果不清楚,下面是使用curl的示例:

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

test

因此,问题在于没有任何引号的“测试”不是JSON字符串,但是我的REST客户端需要一个字符串。我期望curl命令显示带有引号的字符串,因此它是合法的JSON:

"test"

我正在使用Spring WebMVC 4.1.3和Jackson 2.4.3。我尝试向RequestMapping添加“

produces”属性以表示它应返回JSON。在这种情况下,发回的Content-Type属性为“ application /

json”,但测试字符串仍未加引号。

我可以通过调用JSON库以将Java String转换为JSON来解决此问题,但似乎Spring

MVC和Jackson通常会自动执行此操作。然而,就我而言,他们却不这样做。我可能配置错误的任何想法都只是重新测试而不是“测试”?

回答:

事实证明,当您使用@EnableWebMvc注释时,默认情况下它将打开一堆http消息转换器。列表中的第二个是StringHttpMessageConverter文档说明将用于text/*内容类型的列表。但是,在逐步调试之后,它适用于*/*内容类型的String对象-

显然包括application/json

MappingJackson2HttpMessageConverter负责application/json内容类型是这个名单上进一步下跌。因此,对于除String之外的Java对象,将调用此对象。这就是为什么它适用于对象和数组类型,而不适用于字符串的原因,尽管有很好的建议使用Produces属性设置application/json内容类型。尽管必须使用该内容类型才能触发此转换器,但String转换器首先抢占了工作!

当我将WebMvcConfigurationSupport类扩展为其他配置时,我覆盖了以下方法以将Jackson转换器放在第一位,因此,当content-

type为true时,application/json将使用此方法代替String转换器:

@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"输出,而不是just test,因此期望JSON的角度客户端现在很高兴。

以上是 spring mvc restcontroller返回json字符串 的全部内容, 来源链接: utcz.com/qa/430459.html

回到顶部