2013-07-10 7 views
15

Używam leniwego ładowania ze stanu hibernacji w mojej aplikacji internetowej.Jak @autowire some bean into JsonSerializer?

Chciałbym załadować kilka obiektów z bazy danych na etapie analizowania odpowiedzi serwera

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

}

który jest całkowicie zrozumiałe, ponieważ DesignSerializer jest instancja z " nowy "operator dla każdego obiektu.

Jestem pewien, że istnieje sposób na wstrzyknięcie mojej fasolki do tego serializatora, kiedy tylko zostanie utworzony, po prostu nie wiem jak.

Czy możecie mi pomóc lub wskazać mi właściwy kierunek.

+0

Jeśli DesignSerializer jest oznaczony przy użyciu @Component, przypuszczalnie jest to komponent bean, jeśli się nie mylę. Możesz złapać fasolę, która powstała wiosną? –

+0

jak ?, ten serializator jest wywoływany wiosną po skończeniu kontrolera z @ResponseBody – Gleeb

+0

, nie masz [Kontekst aplikacji] (http://static.springsource.org/spring/docs/3.0.x/api/ org/springframework/context/ApplicationContext.html), na którym używasz getBean? –

Odpowiedz

17

Rozwiązanie jest SpringBeanAutowiringSupport jeśli używasz Spring Framework 2.5+.

public class DesignSerializer extends JsonSerializer<Design> { 

    @Autowired 
     IDesignService designService; 
    } 

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

... 

} 

Mam nadzieję, że pomoc, której

+0

Awesome. Tak prosty w porównaniu do innych sugestii w sieci. –

+0

+1 dla SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext (this); To również rozwiązuje mój problem. – YROjha

+0

czy możesz mi powiedzieć, jak używać w moim przypadku programu autowire z jacksonem? http://stackoverflow.com/questions/35436279/autowire-in-deserialization-class – secret

2

I Rozwiązałem problem, tworząc pole statyczne w innej fasoli, a następnie @Autowire jego metodę ustawiającą.

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

jak pokazano w tym wątku: Can you use @Autowired with static fields?

10

mieliśmy ten sam problem z JsonSerializer i wiosennym autowiring. Rozwiązaniem, które zadziałało dla nas, było wykonanie dwóch konstruktorów. Jeden na wiosnę, który ustawia zależność jako pole statyczne, a drugi, który jest używany przez inicjalizację Jacksona.

Działa to, ponieważ wtrysk zależności Spring (autowiring) następuje przed zainicjowaniem serializera przez Jacksona.

@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(..)); 
    } 
} 
Powiązane problemy