2016-05-10 9 views
0

Ich muss ein Objekt in ActiveMQ und dann deserialisieren. Dieses Objekt enthält ein transientes Feld, das bei der Deserialisierung initialisiert werden sollte. Laut diesem Dokument (http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/aop.html#aop-atconfigurable) sollte es im Frühjahr automatisch funktionieren, tut es aber nicht. CloudBean ist nach der Deserialisierung immer null.Spring, AspectJ: Injektion für deserialisierte Objekte

Hier sind meine Klassen:

package core.utilities.handlers; 

//imports... 

@Component 
@Configurable 
public class InitialCopyHandler implements JobHandler { 
    private static final long serialVersionUID = 2617677940515776720L; 
    private static Logger logger = Logger.getLogger(InitialCopyHandler.class); 
    private String username; 
    private String password; 

    @Autowired private transient CloudBean cloudBean; 

    public InitialCopyHandler() { 
    } 

    public InitialCopyHandler(String username, String password) { 
     this.username = username; 
     this.password = password; 
    } 

    @Override 
    public void handle() { 
     try { 
      logger.info("Copy from default to " + username); 
      String webCloudDataDir = cloudBean.getWebCloudDataDir(); 
      Sardine defaultSardine = cloudBean.getDefaultSardine(); 
      InputStream is = defaultSardine.get(webCloudDataDir + FILE_COUNTRIES_LIST); 
      cloudBean.getUserSardine(username,password).put(webCloudDataDir + FILE_COUNTRIES_LIST, is); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

CloudBean.java:

package core.domain.cloud; 

//imports... 

@Component 
public class CloudBean { 
    protected Sardine defaultSardine; 
    protected Sardine userSardine; 
    protected String webCloudDataDir; 
    protected String webCloud; 
    protected static String defaultCar; 
    protected static String defaultCarPassword; 
    protected HttpHeaders headers; 

    @Autowired private ConfigurationFactory configuration; 

    public CloudBean() { 
    } 

// init block 
    @PostConstruct 
    private void init() { 
     webCloudDataDir = configuration.getConfigurationValue(DEFAULT_CLOUD_WEBDAV_LOCATION) + DIR_CLOUD_DATA; 
     webCloud = configuration.getConfigurationValue(DEFAULT_CLOUD_LOCATION); 
     defaultCar = configuration.getConfigurationValue(DEFAULT_CLOUD_ACCOUNT); 
     defaultCarPassword = configuration.getConfigurationValue(DEFAULT_CLOUD_ACCOUNT_PASSWORD); 
     defaultSardine = SardineFactory.begin(defaultCar, defaultCarPassword); 
     defaultSardine.enableCompression(); 

     headers = HttpUtilities.initHeaders(defaultCar,defaultCarPassword); 
    } 

    /** 
    * Initializes Sardine for the particular user 
    * @param username 
    * @param password 
    * @return Sardine 
    */ 
    public Sardine getUserSardine(String username, String password) { 
     userSardine = SardineFactory.begin(username,password); 
     userSardine.enableCompression(); 
     return userSardine; 
    } 

    public Sardine getDefaultSardine() { 
     return defaultSardine; 
    } 

    public String getWebCloudDataDir() { 
     return webCloudDataDir; 
    } 
} 

Auszug aus dem Consumer.java (Deserialisierung Teil):

@Override 
public void onMessage(Message message) { 
    if(message instanceof ObjectMessage) { 
     ObjectMessage objectMessage = (ObjectMessage)message; 
     try { 
      JobHandler msg = (JobHandler)objectMessage.getObject(); 
      es.execute(new Runnable() { 
       @Override 
       public void run() { 
        msg.handle(); 
       } 
      }); 
     } catch (JMSException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Was ist falsch?

+0

Da Sie es nicht in Ihre Frage aufgenommen haben, können Sie eine Spring-Konfiguration wie in 7.8.1 der Dokumentation beschrieben, die Sie verlinkt haben, vermissen. Sie haben vielleicht vergessen, Weben mit AspectJ ('') zu konfigurieren oder die 'AnnotationBeanConfigurerAspect' nicht konfiguriert oder die Abhängigkeit von spring-aspects.jar verpasst. –

Antwort

1

In Ihrem Code ist Spring nicht an der Deserialisierung beteiligt, daher können keine Abhängigkeiten eingefügt werden.

In der verknüpften Frühjahrsdokumentation werden die Pojos von einer Federfabrik erstellt. Sie können diesen Ansatz nicht verwenden, da Sie Ihre Instanzen durch Deserialisierung erstellen.

Was Sie tun können:

In Ihrem Consumer-Klasse eine BeanFactory injiziert bekommen:

@Autowired  
AutowireCapableBeanFactory beanFactory; 

nach Deserialisieren das Objekt autowire es:

JobHandler msg = (JobHandler)objectMessage.getObject(); 
beanFactory.autowireBean(msg); 

das ist alles.

+0

Vielen Dank, Ihr Ratschlag hat es geschafft! – maksim2020