@ResponseBody JSON 格式进行春季配置

2022-09-01 02:49:29

想象一下,我在春季3@Controller

@RequestMapping("")
public @ResponseBody MyObject index(@RequestBody OtherObject obj) {
    MyObject result = ...;
    return result;
}

但是我需要配置输出json格式,就像我正在做的那样:

ObjectMapper om = new ObjectMapper();
om.configure(JsonGenerator.Feature.QUOTE_FIELD_NAMES, true);
om.getSerializationConfig()
        .setSerializationInclusion(JsonSerialize.Inclusion.NON_DEFAULT);
om.getSerializationConfig()
        .set(SerializationConfig.Feature.INDENT_OUTPUT, false);

有没有办法配置此行为?

我发现了几个相关的问题,但我不确定如何使它们适应我的具体情况:

  1. 弹簧前缀json与响应体
  2. 谁在春季 MVC 中设置响应内容类型(@ResponseBody)

谢谢!


答案 1

对于使用基于Java的Spring配置的人:

@Configuration
@ComponentScan(basePackages = "com.domain.sample")
@EnableWebMvc
public class SpringConfig extends WebMvcConfigurerAdapter {
....

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        final MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        final ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        converter.setObjectMapper(objectMapper);
        converters.add(converter);
        super.configureMessageConverters(converters);
    }

....

}

我正在使用 - 这是来自fasterxml。MappingJackson2HttpMessageConverter

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.3.1</version>
</dependency>

如果你想使用codehaus-jackson映射器,请改用这个MappingJacksonHttpMessageConverter

 <dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>${codehaus.jackson.version}</version>
 </dependency>

答案 2

我需要解决非常相似的问题,即将Jackson Mapper配置为“不要为了基督的缘故序列化空值!!!”。

我不想留下花哨的mvc:annotation-driven标签,所以我找到了如何配置Jackson的ObjectMapper,而不删除mvc:annotation-driven并添加不是很花哨的内容NegotiatingViewResolver。

美丽的事情是,您不必自己编写任何Java代码!

这里是XML配置(不要与Jackson类的不同命名空间混淆,我只是使用了新的Jakson 2.x库......同样也应该与Jackson 1.x库一起使用):

<mvc:annotation-driven>
    <mvc:message-converters register-defaults="true">
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="objectMapper">
                <bean class="com.fasterxml.jackson.databind.ObjectMapper">
                    <property name="serializationInclusion">
                        <value type="com.fasterxml.jackson.annotation.JsonInclude.Include">NON_NULL</value>
                    </property>
                </bean>
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

推荐