我需要将一些对象放到ActiveMQ中,然后反序列化它。此对象包含应在反序列化时初始化的瞬态字段。根据这个文档(http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/aop.html#aop-atconfigurable),它应该在Spring中自动工作,但它不会。在反序列化之后,CloudBean总是为null。
以下是我的课程:
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();
}
}
}怎么啦?
发布于 2016-05-10 14:20:15
在您的代码中,Spring只是不涉及反序列化,所以它不能注入任何依赖项。
在链接的spring文档中,pojos是由弹簧工厂创建的。您不能使用该方法,因为您通过反序列化创建实例。
你能做的是:
在你的消费类中,你可以注射一家豆厂:
@Autowired
AutowireCapableBeanFactory beanFactory;在反序列化对象之后,自动读取它:
JobHandler msg = (JobHandler)objectMessage.getObject();
beanFactory.autowireBean(msg);仅此而已。
https://stackoverflow.com/questions/37130685
复制相似问题