2013-07-10 60 views
15

我在我的web應用程序中使用延遲加載與休眠。如何將@autowire一些bean放入JsonSerializer中?

我想在服務器響應

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

}

的分析階段,這是完全可以理解的,因爲DesignSerializer被實例化與加載從數據庫中某些對象「新的「運營商爲每個對象。

我確信有一種方法可以在創建時將我的bean注入到該序列化程序中,但我只是不知道如何。

你們能幫我或指點我正確的方向嗎?

+0

如果DesignSerializer用@Component標記,假設我沒有弄錯,那麼它就是一個bean。你可以抓住Spring創建的bean嗎? –

+0

怎麼樣?這個序列化程序在用@ResponseBody完成控制器後被彈簧調用 – Gleeb

+0

沒有[Application Context](http://static.springsource.org/spring/docs/3.0.x/api/) org/springframework/context/ApplicationContext.html)你使用getBean嗎? –

回答

17

解決方案是SpringBeanAutowiringSupport如果你正在使用Spring框架2.5+。

public class DesignSerializer extends JsonSerializer<Design> { 

    @Autowired 
     IDesignService designService; 
    } 

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

... 

} 

我希望幫你

+0

太棒了。與其他網絡上的其他建議相比,這非常簡單。 –

+0

對於SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this)爲+1;它也解決了我的問題。 – YROjha

+0

你能告訴我如何在傑克遜案例中使用autowire? http://stackoverflow.com/questions/35436279/autowire-in-deserialization-class – secret

2

I通過在不同的bean中創建靜態字段,然後使用其setter方法@Autowire解決了該問題。

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

像顯示在這個線程:Can you use @Autowired with static fields?

10

我們有同樣的問題與JsonSerializer和Spring自動裝配。爲我們工作的解決方案是製作兩個構造函數。一個用於將依賴項設置爲靜態字段的Spring,另一個用於Jackson初始化。

這是有效的,因爲Spring依賴注入(自動裝配)發生在Jackson初始化串行器之前。

@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(..)); 
    } 
} 
相關問題