2017-07-11 1 views
0

Dies ist ein künstliches Beispiel, aber es illustriert meine Frage. Ich möchte eine benutzerdefinierte DynamoDBMarshaller<T> zu Marshall/unmarshall meine Objekte zu/von der Datenbank erstellen. Es benötigt die Spring-Bean CustomMarshaller, die nach der Instanziierung in die MyAttributeMarshaller-Klasse eingefügt werden muss. Da diese Klasse jedoch über die Annotation @DynamoDBMarshalling() erstellt wird, wird sie nicht von Spring verwaltet. Gibt es eine Möglichkeit, meine CustomMarshaller-Spring-Bean in der MyAttributeMarshaller-Klasse verfügbar zu machen?Wie kann eine Spring Bean in eine Implementierung von DynamoDBMarshaller <T> injiziert werden?

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

Und meine marsher Klasse ..

@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 **

ich eine Lösung gefunden, indem zuerst ein Spring-Bean zu funktionieren scheint:

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

Und dann Abrufen meiner Custom Marshaller in der Non-Spring verwaltet MyAttributeMarshaller von:

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

Antwort

0

Ich fürchte nicht. Sie bitten DynamoDB, eine bestimmte Instanz dieser Marshaller-Klasse zu verwenden, die von Spring mit einem CustomMarshaller-Befehl injiziert wurde.

Sie könnten eine CustomMarshaller Instanz in einem statischen Ort/Feld setzen und es von MyAttributeMarshaller abholen, aber das ist ein Schuss im Dunkeln, da der entsandte Code nicht genug ist sicher

zu sagen
Verwandte Themen