如何正确注册自定义JsonSerializer?

Chi*_*ils 7 java spring json spring-mvc jackson

我正在尝试将Ajax帖子用于Spring @RestController.杰克逊有问题,@Json...Reference里面的annnotations @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);
}
Run Code Online (Sandbox Code Playgroud)

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

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...");
    }
}
Run Code Online (Sandbox Code Playgroud)

我试图发布的实体......

@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
}
Run Code Online (Sandbox Code Playgroud)

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

Tua*_*ham 9

好像你没有使用Spring Boot.Jackson2ObjectMapperBuilder不会自动检测到没有Spring Boot的AFAIK .如果要添加自定义序列化程序,则应该执行此操作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()));
    }
}
Run Code Online (Sandbox Code Playgroud)