2013-07-10 1 views
15

Sto utilizzando il caricamento lazy con ibernazione nella mia app web.Come scaricare un bean in JsonSerializer?

vorrei caricare alcuni oggetti dal database in fase di analisi della risposta del server

@Component 
public class DesignSerializer extends JsonSerializer<Design> { 
@Autowired 
IDesignService designService; <-- is null 

}

che è totalmente comprensibile, perché DesignSerializer viene creata un'istanza con la " nuovo "operatore per ogni oggetto.

Sono sicuro che c'è un modo per iniettare il mio bean in quel serializzatore quando mai viene creato, semplicemente non so come.

Potete aiutarmi ragazzi o indicarmi la giusta direzione.

+0

Se DesignSerializer è segno con @Component, si supponga di essere un fagiolo, se non mi sbaglio. Potresti afferrare il fagiolo che è stato creato dalla primavera? –

+0

come ?, questo serializzatore viene chiamato da primavera dopo aver terminato il controller con @ResponseBody – Gleeb

+0

non si dispone di un [Application Context] (http://static.springsource.org/spring/docs/3.0.x/api/ org/springframework/context/ApplicationContext.html) che usi getBean su di esso? –

risposta

17

Solution è SpringBeanAutowiringSupport se si utilizza il framework Spring 2.5+.

public class DesignSerializer extends JsonSerializer<Design> { 

    @Autowired 
     IDesignService designService; 
    } 

    public DesignSerializer(){ 
     SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);  
    } 

... 

} 

Spero che ti aiutano a

+0

Fantastico. Così semplice rispetto ad altri suggerimenti in tutto il Web. –

+0

+1 per SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext (questo); Risolve anche il mio problema. – YROjha

+0

puoi dirmi come usare il autowire nel mio caso con jackson? http://stackoverflow.com/questions/35436279/autowire-in-deserialization-class – secret

2

I Risolto il problema creando un campo statico in un bean diverso e quindi @Autowire il suo metodo setter.

@Service("ToolBox") 
@Transactional 
public class ToolBox 
{ 
static Logger logger = Logger.getLogger(ToolBox.class); 


private static IService service; 


@Autowired 
public void setService(IService service) 
{ 
    ToolBox.service = service; 
} 

public static IService getService() 
{ 
    return ToolBox.service; 
}} 

come mostrato in questa discussione: Can you use @Autowired with static fields?

10

abbiamo avuto lo stesso problema con JsonSerializer e autowiring primavera. La soluzione che ha funzionato per noi era creare due costruttori. Uno per Spring che imposta la dipendenza come un campo statico e un altro che viene utilizzato dall'inizializzazione di Jackson.

Questo funziona perché l'iniezione di dipendenza Spring (autowiring) avviene prima che Jackson inizializzi il serializzatore.

@Component 
public class MyCustomSerializer extends JsonSerializer<String> { 

    private static IDesignService designService; 

    // Required by Jackson annotation to instantiate the serializer 
    public MyCustomSerializer() { } 

    @Autowired 
    public MyCustomSerializer(IDesignService designService) { 
     this.designService = designService; 
    } 

    @Override 
    public void serialize(String m, JsonGenerator gen, SerializerProvider s) { 
     gen.writeObject(MyCustomSerializer.designService.method(..)); 
    } 
}