2013-07-10 17 views
15

Webアプリケーションでhibernateを使用して遅延ロードを使用しています。JsonSerializerに@ beanを@autowireする方法は?

私はDesignSerializerがでインスタンス化されているため、完全に理解できるサーバーの応答

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

}

の解析段階でデータベースからいくつかのオブジェクトをロードしたいと思います」各オブジェクトに対して「新しい」演算子を使用します。

私は自分のbeanを作成したときにそのシリアライザに注入する方法があると確信しています。

あなたは私を助けたり、正しい方向に向けることができますか?

+0

DesignSerializerが@Componentのマークである場合、私が間違っていなければ、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です。

public class DesignSerializer extends JsonSerializer<Design> { 

    @Autowired 
     IDesignService designService; 
    } 

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

... 

} 

私はあなたが

+0

Web上の他の提案と比較して簡単です。 –

+0

+1 SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this); +1それは私の問題も解決します。 – YROjha

+0

ジャクソンで私のケースでオートワイヤーを使う方法を教えてください。 http://stackoverflow.com/questions/35436279/autowire-in-deserialization-class – secret

2

I別のBeanに静的フィールドを作成し、その設定メソッドである@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; 
}} 

:あなたは春のフレームワーク2.5+を使用している場合Can you use @Autowired with static fields?

10

助け我々はJsonSerializerと春のオートワイヤリングと同じ問題を抱えていたことを願っています。私たちのために働いた解決策は、2つのコンストラクタを作ることでした。依存関係を静的フィールドとして設定するSpring用と、Jackson初期化で使用される別のもの。

これは、Jacksonがシリアライザを初期化する前にSpring依存性注入(autowiring)が行われるためです。

@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(..)); 
    } 
} 
関連する問題