2011-12-12 7 views
8

C'è un modo per utilizzare Jackson JSON Views o qualcosa del genere, senza dover annotare la classe bean originale? Sto cercando una specie di configurazione runtime/dinamica per permettermi di fare qualcosa di simile.Utilizzo di Jackson JSON Views senza annotazione della classe bean originale

My bean è un @Entity impacchettato in un JAR che può essere condiviso da più progetti. Sto cercando di evitare di toccare e reimballare il JAR condiviso a causa di modifiche all'interfaccia utente nei progetti che consumano.

Idealmente mi piacerebbe fare qualcosa di simile

jsonViewBuilder = createViewBuilder(View.class); 
jsonViewBuilder.addProperty("property1"); 
jsonViewBuilder.addProperty("property2"); 

per sostituire

Bean { 
    @JsonView(View.class) 
    String property1; 

    @JsonView(View.class) 
    String property2; 
} 

Tutte le idee?

Ambiente sottostante: Spring 3.0, Spring MVC e Glassfish 3.1.1.

risposta

12

Come utilizzare la funzione Mix-In?

http://wiki.fasterxml.com/JacksonMixInAnnotations

http://www.cowtowncoder.com/blog/archives/2009/08/entry_305.html


import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility; 
import org.codehaus.jackson.annotate.JsonMethod; 
import org.codehaus.jackson.map.ObjectMapper; 
import org.codehaus.jackson.map.SerializationConfig; 
import org.codehaus.jackson.map.annotate.JsonView; 

public class JacksonFoo 
{ 
    public static void main(String[] args) throws Exception 
    { 
    ObjectMapper mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD, Visibility.ANY) 
     .configure(SerializationConfig.Feature.DEFAULT_VIEW_INCLUSION, false); 
    mapper.getSerializationConfig().addMixInAnnotations(Bar.class, BarMixIn.class); 
    mapper.setSerializationConfig(mapper.getSerializationConfig().withView(Expose.class)); 

    System.out.println(mapper.writeValueAsString(new Bar())); 
    // output: {"b":"B"} 
    } 
} 

class Bar 
{ 
    String a = "A"; 
    String b = "B"; 
} 

abstract class BarMixIn 
{ 
    @JsonView(Expose.class) 
    String b; 
} 

// Used only as JsonView marker. 
// Could use any existing class, like Object, instead. 
class Expose {} 
+0

posso utilizzare le annotazioni mixin con '@ JsonView'? gli esempi mostrano solo '@ JsonProperty'. – wrschneider

+0

Sì. Risposta aggiornata con esempio. –

+0

Funziona magnificamente, grazie! Ora se c'è solo un modo per refactoring che roba di installazione per evitare di ripetere in ogni controller. – wrschneider

Problemi correlati