web-dev-qa-db-fra.com

Spring Boot + ActiveMQ - Comment définir des packages de confiance?

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 :)

15
AntoineB

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
1
Santhosh Hirekerur

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
0
rocyuan

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;
}
0
Srikanth Josyula