在弹簧休息控制器中作为JSON返回值的简单字符串

2022-09-04 21:11:07

让我们看一下下面的简单测试控制器(与Spring 4.0.3一起使用):

@RestController
public class TestController
{
    @RequestMapping("/getList")
    public List<String> getList()
    {
        final List<String> list = new ArrayList<>();
        list.add("1");
        list.add("2");
        return list;
    }

    @RequestMapping("/getString")
    public String getString()
    {
        return "Hello World";
    }
}

从理论上讲,两种控制器方法都应返回有效的 JSON。调用第一个控制器方法确实返回以下 JSON 数组:

$ curl -i -H "Accept: application/json" http://localhost:8080/getList
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8

["1","2"]

但是第二个控制器方法返回不带引号的字符串,这不是有效的 JSON 字符串:

$ curl -i -H "Accept: application/json" http://localhost:8080/getString
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8

Hello World

为什么会这样?可以配置吗?这是一个错误吗?还是我不理解的功能?


答案 1

当您返回对象时,Spring MVC会将其解释为要放入响应正文中的内容,并且不会进一步修改它。如果您希望实际字符串成为 JSON 响应,则需要自己引用它或通过 Jackson 显式运行它。String


答案 2

您可以删除在杰克逊转换器之前注册的, - 如评论中提到的。StringHttpMessageConverter

/**
 * Unregister the default {@link StringHttpMessageConverter} as we want
 * Strings to be handled by the JSON converter.
 *
 * Our MappingJackson2HttpMessageConverter will deal with strings.
 *
 * @param converters
 *            List of already configured converters
 */
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
    converters.removeIf(converter -> converter instanceof StringHttpMessageConverter);
}