【问题标题】:Jackson Object Mapper in spring MVC not workingSpring MVC中的Jackson Object Mapper无法正常工作
【发布时间】:2013-12-09 15:32:03
【问题描述】:

每个具有 Date 格式的对象都被序列化为 long。

我已经阅读过我需要创建一个自定义对象映射器

所以我做到了:

public class CustomObjectMapper extends ObjectMapper {

    public CustomObjectMapper() {
        super();
        configure(Feature.WRITE_DATES_AS_TIMESTAMPS, false);
        setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

    }

}

我还将该自定义映射器注册为转换器

@Override
protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    converters.add(converter());
    addDefaultHttpMessageConverters(converters);
}

@Bean
MappingJacksonHttpMessageConverter converter() {
    MappingJacksonHttpMessageConverter converter = new MappingJacksonHttpMessageConverter();
    converter.setObjectMapper(new CustomObjectMapper());

    return converter;
}

但是,它仍然不起作用,我收到了一个很长的日期。

知道我做错了什么吗?

【问题讨论】:

  • 只是猜测。但是如果你使用 Jackson2,你应该使用 MappingJackson2HttpMessageConverter
  • 嗨巴特,不使用杰克逊 2

标签: json spring-mvc jackson


【解决方案1】:

您需要实现自己的 Dateserializer,如下所示(从 tutorial 得到它,所以是 Loiane 的道具,而不是我 ;-)):

package ....util.json;

import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.map.JsonSerializer;
import org.codehaus.jackson.map.SerializerProvider;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

@Component
public class JsonDateSerializer extends JsonSerializer<Date>{

private static final SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm "); // change according to your needs 

@Override
public void serialize(Date date, JsonGenerator gen, SerializerProvider provider)
        throws IOException {

    String formattedDate = dateFormat.format(date);

    gen.writeString(formattedDate);
}

}

那么您只需将以下注释添加到您的 Date-Objects 中,它将保持正常:

@JsonSerialize(using = JsonDateSerializer.class)
public Date getCreated() {
    return created;
}

至少它适用于 spring 3.2.4 和 jackson 1.9.13。

编辑:考虑使用 FastDateFormat 而不是 SimpleDateFormat,因为它是线程安全的替代方案(如 Loianes 的 cmets 文章中所述)

【讨论】:

  • 嗨,Dominik,这可行,但我在许多 DTO 中有很多 Date 对象,所以这不是一个可行的解决方案。
  • 为什么会出现问题?也许您可以编写一个简短的 PERL 脚本来处理...
  • @ItaiSagi 只是查看我的旧答案并找到了这个。确实,你必须这样做,但是……嗯,作为 MR。垃圾说,这只是要走的路,所以如果你接受这个答案会很好:-)或者你找到了另一种方法?如果是这样,请告诉我,我会很感兴趣。最好的问候
【解决方案2】:

尝试在#add() 中添加0 作为索引

@Configuration
@ComponentScan()
@EnableWebMvc
@PropertySource("classpath:/web.properties")
public class WebConfig extends WebMvcConfigurerAdapter
{

    @Override
    public void configureMessageConverters(final List<HttpMessageConverter<?>> converters)
    {
        converters.add(0, jsonConverter());
    }

    @Bean
    public MappingJacksonHttpMessageConverter jsonConverter()
    {
        final MappingJacksonHttpMessageConverter converter = new MappingJacksonHttpMessageConverter();
        converter.setObjectMapper(new CustomObjectMapper());

        return converter;
    }
}

它对我有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-12
    • 2012-09-03
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 2018-10-29
    相关资源
    最近更新 更多