Java 如何正确注册自定义JsonSerializer?

Java 如何正确注册自定义JsonSerializer?,java,json,spring,spring-mvc,jackson,Java,Json,Spring,Spring Mvc,Jackson,我正在尝试使用Ajax发布到Spring@RestController。Jackson在发布的实体继承自(@heritance(strategy=InheritanceType.JOINED))的@实体内的@Json…Reference注释方面存在问题 我已经看到了很多关于这方面的问题和答案。目前,不允许永久更改父实体。我确实可以访问本地副本,并且可以临时更改本地副本,因此我能够确认删除父副本中的注释可能会修复它,大概是以破坏其他内容为代价的。因此,我的解决方案是实现一个定制的JsonSeria

我正在尝试使用Ajax发布到Spring
@RestController
。Jackson在发布的实体继承自(
@heritance(strategy=InheritanceType.JOINED)
)的
@实体内的
@Json…Reference
注释方面存在问题

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

问题是它没有被呼叫;从我所看到的来看,我认为我做得对。以下是相关代码:

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

@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...");
    }
}
公共类OrchardSerializer扩展JsonSerializer{
@凌驾
公共类handledType(){
返回Orchard.class;
}
@凌驾
公共无效序列化(Orchard Orchard、JsonGenerator、JsonGenerator、SerializerProvider SerializerProvider)
抛出JsonProcessingException{
System.out.println(“打断我…”);
}
}
我试图发布的实体

@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
}
@实体
@继承(策略=InheritanceType.JOINED)
@JsonSerialize(使用=OrchardSerializer.class)
公营果园{
@OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL)
私人名单联系人;
@列(name=“COUNT”)
私有整数计数;
…能手/二传手
}

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

看起来您没有使用Spring Boot。不带弹簧靴的AFAIK
Jackson2ObjectMapperBuilder
不会自动检测到。如果要添加自定义序列化程序,应在
WebMVCConfigureAdapter
中进行

@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()));
    }
}
@配置
@EnableWebMvc
公共类网络配置扩展了WebMVCConfigureAdapter{
@凌驾

public void configureMessageConverters(列表可能,您需要定制的HttpMessageConverter?谢谢,在我尝试的所有解决方案中,这是一个将工作推到极致的解决方案。