如何正确注册自定义JsonSerializer?

时间:2016-03-11 19:53:20

标签: java json spring spring-mvc jackson

我正在尝试将Ajax帖子用于Spring @RestController。杰克逊在@Json...Reference内有@Entity个注释问题,发布者继承自(@Inheritance(strategy = InheritanceType.JOINED))。

我已经看到了很多关于这方面的问题和答案。截至目前,不允许永久更改父实体。我确实可以访问,并且可以暂时更改我的本地副本,因此我已经能够确认删除父级中的注释可能会修复它,可能是以破坏其他内容为代价。所以,我的解决方案是实现自定义JsonSerializer

问题在于它没有被调用;我想我已经从我所看到的那样做得很好。这是相关代码:

我在@Bean文件中注册了AppConfig。我尝试过方法体的变体;这只是最近一个不起作用的......

@Bean
public Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder() {
    SimpleModule m = new SimpleModule();
    m.addSerializer(Orchard.class, new OrchardSerializer());
    return new Jackson2ObjectMapperBuilder().modules(m);
}

我提供序列化器;下面的断点永远不会被触发......

public class OrchardSerializer extends JsonSerializer<Orchard> {

    @Override
    public Class<Orchard> handledType() {
        return Orchard.class;
    }

    @Override
    public void serialize(Orchard orchard, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) 
    throws JsonProcessingException {
        System.out.println("Break on me...");
    }
}

我想发布的实体......

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@JsonSerialize(using = OrchardSerializer.class)
public class Orchard extends Yard {

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private List<Person> contacts;

    @Column(name = "COUNT")
    private Integer count;

    ...getters/setters
}

如何注册自定义JsonSerializer以便在Ajax帖子上调用它?

1 个答案:

答案 0 :(得分:9)

好像你没有使用Spring Boot。不会自动检测到没有Spring Boot的{AFAIK Jackson2ObjectMapperBuilder。如果要添加自定义序列化程序,则应在WebMvcConfigurerAdapter中执行此操作。

@Configuration
@EnableWebMvc
public class WebConfiguration extends WebMvcConfigurerAdapter {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        SimpleModule m = new SimpleModule();
        m.addSerializer(Orchard.class, new OrchardSerializer());
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder().modules(m);
        converters.add(new MappingJackson2HttpMessageConverter(builder.build()));
    }
}