我需要將一些對象放入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();
}
}
}
有什麼不對?
由於您沒有將它包含在您的問題中,因此您可能會錯過鏈接到的文檔的7.8.1中的某些Spring配置。所以你可能忘記用AspectJ配置編織(' '),或者沒有配置'AnnotationBeanConfigurerAspect',或者你可能錯過了對spring-aspects.jar的依賴。 –