2016-05-10 56 views
0

我需要將一些對象放入ActiveMQ中,然後反序列化它。該對象包含應在反序列化時初始化的瞬態字段。根據該文檔(http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/aop.html#aop-atconfigurable),它應該在Spring中自動工作,但它不會。反序列化後,CloudBean始終爲空。Spring,AspectJ:針對反序列化對象的注入

這裏是我的課:

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

從Consumer.java(反序列化部分)摘錄:

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

有什麼不對?

+0

由於您沒有將它包含在您的問題中,因此您可能會錯過鏈接到的文檔的7.8.1中的某些Spring配置。所以你可能忘記用AspectJ配置編織(''),或者沒有配置'AnnotationBeanConfigurerAspect',或者你可能錯過了對spring-aspects.jar的依賴。 –

回答

1

在你的代碼中Spring只是沒有參與反序列化,所以它不能注入任何依賴關係。

在鏈接的spring文檔中,pojos是由一個彈簧工廠創建的。你不能使用這種方法,因爲你通過反序列化來創建你的實例。

你可以做什麼:

在你的消費類獲得一個bean工廠注入:

@Autowired  
AutowireCapableBeanFactory beanFactory; 

反序列化對象之後自動裝配它:

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

多數民衆贊成。

+0

非常感謝你,你的建議做到了! – maksim2020