2017-07-11 12 views
0

これは人為的な例ですが、私の質問を示しています。データベースとの間でオブジェクトをマーシャリング/アンマーシャリングするためのカスタムDynamoDBMarshaller<T>を作成します。 CustomMarshaller Spring Beanが必要です。インスタンス化された後、MyAttributeMarshallerクラスに注入する必要があります。ただし、このクラスは@DynamoDBMarshalling()アノテーションによって作成されるため、Springで管理されません。 CustomMarshallerスプリングBeanをMyAttributeMarshallerクラスで使用できるようにする方法はありますか? ** DynamoDBMarshallerの実装にSpring Beanを挿入する方法<T>?

@DynamoDBTable(tableName = "MyTable") 
public class ObjectInTable 
{ 
    @DynamoDBAttribute(attributeName = "myAttribute") 
    @DynamoDBMarshalling(marshallerClass = MyAttributeMarshaller.class) 
    public MyAttribute getMyAttribute() { ... } 
    public MyAttribute setMyAttribute(MyAttribute o) { ... } 
} 

そして、私のmarsherクラス..

@Named 
public class MyAttributeMarshaller implements DynamoDBMarshaller<MyAttribute> 
{ 
    @Override 
    public String marshall(MyAttribute o) 
    { 
     return marshaller.marshall(o); 
    } 
    @Override 
    public ProviderContentReference unmarshall(Class<ProviderContentReference> clazz, String obj) 
    { 
     return marshaller.unmarshall(o); 
    } 
    @Inject 
    private CustomMarshaller marshaller; // ERROR: null 
} 

UPDATE **

私は最初のSpring Beanを作成することで動作するように思われる解決策を見つけた:

@Named 
public class SpringContext implements ApplicationContextAware 
{ 
    private static ApplicationContext context; 

    public void setApplicationContext(ApplicationContext context) throws BeansException 
    { 
     this.context = context; 
    } 
    public static ApplicationContext getApplicationContext() { 
     return context; 
    } 
} 

その後、Non-Springで管理されているカスタムマーシャラーを取得MyAttributeMarshaller by

private CustomMarshaller marshaller = (CustomMarshaller) 
    SpringContext.getApplicationContext().getBean("customMarshaller"); 

答えて

0

私は恐れていません。 DynamoDBに、CustomMarshallerでSpringによってインジェクションされたマーシャルクラスの特定のインスタンスを使用するように要求しています。

あなたは、静的な場所/フィールドにCustomMarshallerインスタンスを入れて、MyAttributeMarshallerからそれを拾うが、掲示コードが

確かに言うだけでは十分ではないので、これは暗闇の中でショットです可能性があり
関連する問題