首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring,AspectJ:反序列化对象的注入

Spring,AspectJ:反序列化对象的注入
EN

Stack Overflow用户
提问于 2016-05-10 06:22:40
回答 1查看 337关注 0票数 0

我需要将一些对象放到ActiveMQ中,然后反序列化它。此对象包含应在反序列化时初始化的瞬态字段。根据这个文档(http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/aop.html#aop-atconfigurable),它应该在Spring中自动工作,但它不会。在反序列化之后,CloudBean总是为null。

以下是我的课程:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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 (反序列化部分):

代码语言:javascript
复制
@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();
        }
    }
}

怎么啦?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-10 14:20:15

在您的代码中,Spring只是不涉及反序列化,所以它不能注入任何依赖项。

在链接的spring文档中,pojos是由弹簧工厂创建的。您不能使用该方法,因为您通过反序列化创建实例。

你能做的是:

在你的消费类中,你可以注射一家豆厂:

代码语言:javascript
复制
@Autowired    
AutowireCapableBeanFactory beanFactory;

在反序列化对象之后,自动读取它:

代码语言:javascript
复制
 JobHandler msg = (JobHandler)objectMessage.getObject();
 beanFactory.autowireBean(msg);

仅此而已。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37130685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档