1

我正在使用 @Responsebody String 发送 JSON。我的部分代码如下。(抱歉全部打开)

@RequestMapping(value = "/getSomeList", method = RequestMethod.GET ,
            headers="Accept=application/json", produces = "text/plain;charset=UTF-8")
    public @ResponseBody String getThumbList(
            @RequestParam("con_id") String con_id) throws Exception{
return json;

}

实际上它会发送 Json。但我的客户要求 Bson 类型。如何在不编辑全局格式的情况下将 Json 更改为 Bson(我的 json 实际上只是字符串,我听说 spring 无法响应 bson。是吗?)。

4

2 回答 2

2

您需要注册一个HttpMessageConverter可以转换为 BSON 的。

<mvc:annotation-driven>
     <mvc:message-converters>
          <bean class="MyBsonHttpMessageConverter"/>
     </mvc:message-converters>
</mvc:annotation-driven>

不幸的是 Spring 没有 Bson Http 消息转换器,所以你必须自己实现。(或者在谷歌搜索时比我运气好)。

于 2013-08-30T06:16:06.427 回答
2

这是一个老问题,但它几乎是我在网上能找到的关于这个主题的唯一内容。

所以这里是如何做到的。假设您在 Spring 中使用 Jackson 作为 JSON 库。

  1. 向Michel Krämer 的 bson4jackson 库添加依赖项
  2. 像这样创建一个类:
import com.fasterxml.jackson.databind.ObjectMapper;
import de.undercouch.bson4jackson.BsonFactory;
import de.undercouch.bson4jackson.BsonGenerator;
import org.springframework.http.MediaType;
import org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;

import javax.annotation.Nonnull;

public class MappingJackson2BsonHttpMessageConverter
    extends AbstractJackson2HttpMessageConverter
{
    public MappingJackson2BsonHttpMessageConverter(@Nonnull Jackson2ObjectMapperBuilder builder) {
        super(bsonObjectMapper(builder), MediaType.parseMediaType("application/bson"));
    }

    @Nonnull
    private static ObjectMapper bsonObjectMapper(@Nonnull Jackson2ObjectMapperBuilder om){
        BsonFactory f = new BsonFactory();
        f.configure(BsonGenerator.Feature.ENABLE_STREAMING, true);

        return om.factory(f).build();
    }
}

  1. 将其作为 a 添加@Bean到您的配置中,或使用注释@Component并确保它在您@ComponentScan的路径中。

就是这样。现在,如果您使用@RequestMapping(produces = "application/bson")(以某种形式)声明您的 MVC 端点,则输出将是您的 ResponseEntity 主体的 BSON 编码。

这适用于通常序列化为 JSON 的带有 Jackson 注释的对象;ObjectMapper并且您通过 Spring、模块或注释对 Jackson 所做的所有配置都将适用。

它也适用于输入和输出。

它也适用于Feign 客户。我认为它也适用于 Spring 的RestTemplate.

于 2020-12-01T20:56:12.910 回答