Spring 4的Jackson美化打印功能

4

目标是使控制器返回的Jackson格式响应具有PrettyPrint效果。以下是我的配置:

@EnableWebMvc
@Configuration
public class JacksonConfig extends WebMvcConfigurerAdapter {
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        for (HttpMessageConverter<?> converter : converters) {
            if (converter instanceof MappingJackson2HttpMessageConverter) {
                MappingJackson2HttpMessageConverter jsonMessageConverter = (MappingJackson2HttpMessageConverter) converter;
                ObjectMapper objectMapper = jsonMessageConverter.getObjectMapper();
                objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
                objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
            }
        }
    }
} 

这是控制器的外观:
@RequestMapping(value = "/facebook", method = RequestMethod.POST, produces = "application/json")
public @ResponseBody Map<String, Object> authorizeViaFacebook(
        @RequestParam(value = "token") String token) throws DefaultException{

    Facebook facebook = this.facebookUtility.getFacebook(token);
    org.springframework.social.facebook.api.User facebookUserProfile = facebook.userOperations().getUserProfile("me");

    User loggedInUser = User.signInWithFacebookProfile(facebookUserProfile);

    return ImmutableMap.of("token", loggedInUser.tokenForAuthentication(), "user", loggedInUser);
}

但无论我做什么,它仍然是直接打印出来的。我尝试了不同的配置,但仍然没有成功。
这是一个Jackson的POM文件:
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.6.0</version>
    </dependency>

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

Spring版本为4.2.4.RELEASE。

我该如何使Jackson使用PrettyPrint格式?


你确定你的浏览器可以正确解析application/json格式吗? - Stefan
@Stefan 我主要使用终端。但是在浏览器中查看响应是个好主意。 - Mehdzor
@user2669657 尝试了,但没有成功。也许是我用来配置映射器的方法有问题? - Mehdzor
你确定 if instanceof 返回 true 吗?我在重写 configureMessageConverters 方法时使用它,它是有效的。 - user2669657
@user2669657,这适用于Jackson消息转换器。尝试调用configureMessageConverters方法并使用对象映射器从头创建转换器,但仍然没有任何效果。 - Mehdzor
显示剩余2条评论
3个回答

3

我曾经在尝试配置一个Jackson对象映射器的时候遇到了类似的问题,这是在Roo生成的项目中。你需要将这些代码段放入webmvc-config中,以使用自定义的对象映射器来替换默认值:

<mvc:annotation-driven>
   <mvc:message-converters register-defaults="false">
       <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
           <property name="objectMapper">
               <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                   <property name="objectMapper">
                       <array>
                           <bean class="com.yourproject.example.CustomObjectMapper"/>
                       </array>
                   </property>
               </bean>
           </property>
       </bean>
   </mvc:message-converters>
</mvc:annotation-driven>

希望这可以帮到您。要使用基于代码的配置来配置Jackson,您需要设置WebApplicationInitializer。您可以通过以下链接找到更多信息:http://docs.spring.io/spring/docs/4.2.x/javadoc-api/org/springframework/web/WebApplicationInitializer.html

2

Spring Boot允许通过.properties文件中的spring.jackson.*属性进行Jackson配置。

spring.jackson.serialization.indent-output=true

我们还可以在@Components中自动装配这个配置好的ObjectMapper。如果不需要全局配置,则objectMapper.writerWithDefaultPrettyPrinter()会打开默认缩进。

已经在使用jackson-databind-2.6.5.jar的spring-boot 1.5.8.RELEASE版本进行了测试。


1
为了补充@Jenky的答案,这里提供一个使用代码方法配置Jackson的映射器以进行漂亮的打印示例。在此示例中,我使用spring-boot-starter-1.3.3.RELEASE。只需将此类放在类路径上,Spring Boot就会自动检测到它。
@Configuration
public class CustomWebMvcConfiguration extends WebMvcConfigurationSupport {

    @Override
    protected void extendMessageConverters( List<HttpMessageConverter<?>> converters ) {

        for ( HttpMessageConverter<?> converter : converters ) {

            if ( converter instanceof MappingJackson2HttpMessageConverter ) {

                MappingJackson2HttpMessageConverter jacksonConverter = (MappingJackson2HttpMessageConverter) converter;

                jacksonConverter.setPrettyPrint( true );

            }

        }

    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接