我从spring控制器返回一个字符串对象,如
@RequestMapping(value = "/persons.html", method = RequestMethod.GET)
public @ResponseBody String listPersonHtml(Model model) {
return "{\"abc\":\"test\"}";
}
我得到的答案就像“{\”abc \“:\”test \“}”,我希望这个回复为
{ “ABC”: “测试”}
即纯json对象。
我需要什么类型的配置?
在UI方面,如果我设置了Accept */*
,那么我就会遇到此问题,如果我设置了Accept text/html
或Accept text/plain
,那么就没有问题,但我无法更改接受标头。
答案 0 :(得分:1)
我找到了方法。它全部都是关于spring message-converters。我在这个列表中添加了MappingJackson2HttpMessageConverter,这个转换器尝试将字符串转换为json并产生这个结果。 只需在MappingJackson2HttpMessageConverter之前添加org.springframework.http.converter.StringHttpMessageConverter,以便StringHttpMessageConverter可以生效,字符串可以按原样返回。
答案 1 :(得分:1)
一个老问题,但是我只需要解决同样的问题,我发现的大多数答案都产生了误导,所以这是我的:
这一切都始于Controller,Spring尝试以调用客户端期望的格式回答映射的请求。客户端可以使用不同的HTTP功能来告知此信息,并且在其中涉及不同的HttpMessageConverter实现。 ContentNegotiationManager采用了Spring Pick的格式,可以根据不同的策略进行回答。
通过在MappingJackson2XmlHttpMessageConverter上优先StringHttpMessageConverter,您只告诉Spring在“ application / json”上以“文本/纯文本”格式回答,并且它将一直有效,直到客户端指定期望json响应(这是尽管还有其他方法,但通常是通过在请求中设置Accept头来完成的。重要的是,如果客户端将标头设置为“ application / json”,Spring将使用MappingJackson2XmlHttpMessageConverter将Java字符串转换为Json字符串,最后以类似“ {\” abc \”:\“ test \ “}”代替{“ abc”:“ test”}
因此,在这种情况下,每个开发人员面临的真正问题是MappingJackson2XmlHttpMessageConverter将Java字符串转换为Json字符串,在某些情况下,您可能不需要这样做,因为该字符串包含有效的json,需要在不返回的情况下返回该json。修改。这个MessageConverter有一些配置类,但是我没有走这条路,因为我只需要在某些特定端点中返回诸如“ raw” Json之类的字符串(性能是关键驱动因素)。这是恢复我的“方法”的示例:
@RestController
@RequestMapping(value = "test", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public class TestController {
@RequestMapping(method = RequestMethod.GET, value = "endpoint")
public JsonObject getSomeJson() {
return new JsonObject("{\"abc\":\"test\"}");
}
private static class JsonObject {
private String rawJsonValue;
JsonObject(String rawJsonValue) {
this.rawJsonValue = rawJsonValue;
}
@JsonValue @JsonRawValue
public String getRawJsonValue() {
return rawJsonValue;
}
}
}
@JsonValue和@JsonRawValue是Jackson注释,它们告诉MappingJackson2XmlHttpMessageConverter将getRawJsonValue方法结果视为JsonObject的Json表示形式,而无需进行任何修改。端点的响应将为{“ abc”:“ test”}