Je crée deux applications serveur et client Springboot communiquant à l'aide de JMS, et tout fonctionne correctement avec la version 5.12.1
pour activemq, mais dès que je mets à jour le 5.12.3
version, j'obtiens l'erreur suivante:
org.springframework.jms.support.converter.MessageConversionException: Could not convert JMS message; nested exception is javax.jms.JMSException: Failed to build body from content. Serializable class not available to broker. Reason: Java.lang.ClassNotFoundException: Forbidden class MyClass! This class is not trusted to be serialized as ObjectMessage payload. Please take a look at http://activemq.Apache.org/objectmessage.html for more information on how to configure trusted classes.
J'ai continué l'URL qui est fourni et j'ai compris que mon problème était lié à la nouvelle sécurité implémentée dans le 5.12.2
version d'ActiveMQ, et je comprends que je pourrais y remédier en définissant les packages de confiance, mais je ne sais pas où placer une telle configuration dans mon projet SpringBoot.
La seule référence que je fais à la file d'attente JMS dans mon client et mon serveur est la configuration de son URI dans application.properties et l'activation de JMS sur ma classe "principale" avec @EnableJms
, et voici ma configuration sur le courtier séparé:
@Configuration
@ConfigurationProperties(prefix = "activemq")
public class BrokerConfiguration {
/**
* Defaults to TCP 10000
*/
private String connectorURI = "tcp://0.0.0.0:10000";
private String kahaDBDataDir = "../../data/activemq";
public String getConnectorURI() {
return connectorURI;
}
public void setConnectorURI(String connectorURI) {
this.connectorURI = connectorURI;
}
public String getKahaDBDataDir() {
return kahaDBDataDir;
}
public void setKahaDBDataDir(String kahaDBDataDir) {
this.kahaDBDataDir = kahaDBDataDir;
}
@Bean(initMethod = "start", destroyMethod = "stop")
public BrokerService broker() throws Exception {
KahaDBPersistenceAdapter persistenceAdapter = new KahaDBPersistenceAdapter();
persistenceAdapter.setDirectory(new File(kahaDBDataDir));
final BrokerService broker = new BrokerService();
broker.addConnector(getConnectorURI());
broker.setPersistent(true);
broker.setPersistenceAdapter(persistenceAdapter);
broker.setShutdownHooks(Collections.<Runnable> singletonList(new SpringContextHook()));
broker.setUseJmx(false);
final ManagementContext managementContext = new ManagementContext();
managementContext.setCreateConnector(true);
broker.setManagementContext(managementContext);
return broker;
}
}
J'aimerais donc savoir où je suis censé spécifier les packages de confiance.
Merci :)
Je configure Java_opts comme ci-dessous et je passe à Java command et son travail pour moi.
Java_OPTS=-Xmx256M -Xms16M -Dorg.Apache.activemq.SERIALIZABLE_PACKAGES=*
Java $Java_OPTS -Dapp.config.location=/data/config -jar <your_jar>.jar --spring.config.location=file:/data/config/<your config file path>.yml
Oui j'ai trouvé que c'est config dans la nouvelle version
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.0.RELEASE</version>
</parent>
spring:
profiles:
active: @profileActive@
cache:
ehcache:
config: ehcache.xml
activemq:
packages:
trusted: com.stylrplus.api.model
Si quelqu'un cherche toujours une réponse, l'extrait ci-dessous a fonctionné pour moi
@Bean
public ActiveMQConnectionFactory connectionFactory() {
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
connectionFactory.setBrokerURL(BROKER_URL);
connectionFactory.setPassword(BROKER_USERNAME);
connectionFactory.setUserName(BROKER_PASSWORD);
connectionFactory.setTrustAllPackages(true); // all packages are considered as trusted
//connectionFactory.setTrustedPackages(Arrays.asList("com.my.package")); // selected packages
return connectionFactory;
}