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转换器:
@Overrideprotected 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