Ich muss ein Objekt in ActiveMQ und dann deserialisieren. Dieses Objekt enthält ein transientes Feld, das bei der Deserialisierung initialisiert werden sollte. Laut diesem Dokument (http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/aop.html#aop-atconfigurable) sollte es im Frühjahr automatisch funktionieren, tut es aber nicht. CloudBean ist nach der Deserialisierung immer null.Spring, AspectJ: Injektion für deserialisierte Objekte
Hier sind meine Klassen:
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;
}
}
Auszug aus dem Consumer.java (Deserialisierung Teil):
@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();
}
}
}
Was ist falsch?
Da Sie es nicht in Ihre Frage aufgenommen haben, können Sie eine Spring-Konfiguration wie in 7.8.1 der Dokumentation beschrieben, die Sie verlinkt haben, vermissen. Sie haben vielleicht vergessen, Weben mit AspectJ (' ') zu konfigurieren oder die 'AnnotationBeanConfigurerAspect' nicht konfiguriert oder die Abhängigkeit von spring-aspects.jar verpasst. –