2016-03-11 11 views
5

Sto cercando di utilizzare i post Ajax su Spring @RestController. Jackson ha problemi con le annotazioni @Json...Reference all'interno dello @Entity ereditato da quello pubblicato (@Inheritance(strategy = InheritanceType.JOINED)).Come registrare correttamente un JsonSerializer personalizzato?

Ho visto molte domande e risposte a riguardo. A partire da ora, la modifica permanente dell'entità padre non è consentita. Ho accesso a, e posso cambiare temporaneamente, la mia copia locale, quindi sono stato in grado di confermare la rimozione delle annotazioni nel genitore potrebbe potenzialmente risolvere il problema, presumibilmente, al costo di rompere qualcos'altro. Quindi, la mia soluzione è implementare una custom JsonSerializer.

Il problema è che non viene chiamato; Penso di averlo fatto correttamente da quello che ho visto. Ecco il codice relativo:

Registro il @Bean nel mio file AppConfig. Ho provato le varianti per il corpo del metodo; questo è solo il più recente che non funziona ...

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

Fornisco il serializzatore; il punto di rottura sotto non viene mai attivato ...

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..."); 
    } 
} 

L'entità che sto cercando di inviare ...

@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 
} 

Come faccio a registrare una consuetudine JsonSerializer quindi sarà chiamato su un Ajax inviare?

+0

Possibile, è necessario HttpMessageConverter personalizzato? –

risposta

4

Sembra che tu non stia usando Spring Boot. AFAIK senza Spring Boot Jackson2ObjectMapperBuilder non vengono rilevati automaticamente. Se vuoi aggiungere un serializzatore personalizzato dovresti farlo in 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())); 
    } 
}