2016-04-14 30 views
8

Sto creando due server di applicazioni client & springboot che comunicano utilizzando JMS, e tutto funziona bene il rilascio 5.12.1 per ActiveMQ, ma appena posso aggiornare alla versione 5.12.3, sto ottenendo il seguente errore:SpringBoot + ActiveMQ - Come impostare pacchetti attendibili?

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. 

Sono andato su the URL che è fornito e ho capito che il mio problema è legato alla nuova sicurezza implementata nella versione 5.12.2 di ActiveMQ, e ho capito che potevo risolverlo definendo i pacchetti attendibili, ma non ne ho idea su dove inserire una tale configurazione nel mio progetto SpringBoot.

L'unico riferimento che sto facendo alla coda JMS nel mio client e nel mio server è la sua impostazione URI in application.properties e abilitazione JMS sulla mia classe "principale" con @EnableJms, ed ecco la mia configurazione sul broker separato :

@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; 
    } 
} 

Quindi mi piacerebbe sapere dove dovrei specificare i pacchetti attendibili.

Grazie :)

risposta

11

Aggiungere il seguente fagiolo:

@Bean 
public ActiveMQConnectionFactory activeMQConnectionFactory() { 
    ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("your broker URL"); 
    factory.setTrustedPackages(Arrays.asList("com.my.package")); 
    return factory; 
} 

La capacità di fare questo tramite una proprietà di configurazione è stato aggiunto per la prossima release: https://github.com/spring-projects/spring-boot/issues/5631

+0

Thanks :) Ho appena avuto a modificare la risposta in quanto 'setTrustedPackage' solo prende un' 'lista come parametro e non un' STRING'. – AntoineB

+0

Doh! Scusa, certo che lo è. ActiveMQConnectionFactory ha anche un metodo setTrustAllPackages (booleano) in modo da non doverli impostare singolarmente. –

11

Si può solo impostare una delle proprietà di avvio di primavera in application.properties per impostare pacchetti attendibili.

spring.activemq.packages.trust-all=true

o

spring.activemq.packages.trusted=<package1>,<package2>,<package3>

+0

Suppongo che sia disponibile solo nelle versioni Springer Boot più recenti? – AntoineB

0

Sì ho trovato che è config nella nuova versione

<parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.4.0.RELEASE</version> 
</parent> 

spring: 
profiles: 
    active: @[email protected] 
cache: 
    ehcache: 
    config: ehcache.xml 
activemq: 
    packages: 
    trusted: com.stylrplus.api.model 
1

Metodo: public void setTrustedPackages(List<String> trustedPackages)

Descrizione: aggiungere tutti i pacchetti che è u inviare e ricevere l'oggetto Message.

Codice: connectionFactory.setTrustedPackages(Arrays.asList("org.api","java.util"))

implementated Codice:

private static final String DEFAULT_BROKER_URL = "tcp://localhost:61616"; 

private static final String RESPONSE_QUEUE = "api-response"; 

@Bean 
public ActiveMQConnectionFactory connectionFactory(){ 
    ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(); 
    connectionFactory.setBrokerURL(DEFAULT_BROKER_URL); 
    connectionFactory.setTrustedPackages(Arrays.asList("org.api","java.util")); 
    return connectionFactory; 
} 

@Bean 
public JmsTemplate jmsTemplate(){ 
    JmsTemplate template = new JmsTemplate(); 
    template.setConnectionFactory(connectionFactory()); 
    template.setDefaultDestinationName(RESPONSE_QUEUE); 
    return template; 
}