2016-05-10 2 views
0

Мне нужно поместить некоторый объект в ActiveMQ, а затем десериализовать его. Этот объект содержит переходное поле, которое должно быть инициализировано при десериализации. Согласно этому документу (http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/aop.html#aop-atconfigurable) он должен работать автоматически весной, но это не так. 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

Поскольку вы не включили его в свой вопрос, вы можете пропустить некоторую конфигурацию Spring, как требуется в 7.8.1 документации, к которой вы привязались. Поэтому вы можете забыть настроить плетение с помощью AspectJ ('') или не настроить «AnnotationBeanConfigurerAspect», иначе вы можете пропустить зависимость от spring-aspects.jar. –

ответ

1

В вашем коде Spring не участвует в десериализации, поэтому он не может вводить какие-либо зависимости.

В связанной весенней документации pojos созданы пружинным заводом. Вы не можете использовать этот подход, потому что вы создаете свои экземпляры путем десериализации.

Что вы можете сделать:

В вашем потребительского класса получить боб завод впрыскивается:

@Autowired  
AutowireCapableBeanFactory beanFactory; 

после десериализации объекта autowire его:

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

вот и все.

+0

Большое спасибо, ваш совет сделал трюк! – maksim2020