2016-04-14 20 views
8

Ich erstelle zwei springboot Server & Client-Anwendungen zu kommunizieren JMS verwenden und alles funktioniert prima die Veröffentlichung 5.12.1 für activemq, aber sobald ich auf die 5.12.3 Version aktualisieren, ich die folgende Fehlermeldung erhalten:SpringBoot + ActiveMQ - Wie setzt man vertrauenswürdige Pakete?

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. 

Ich ging auf the URL, die bereitgestellt wird, und ich herausgefunden, dass mein Problem mit der neuen Sicherheit in der 5.12.2 Release von ActiveMQ umgesetzt, und ich verstehe, dass ich es durch die Definition der vertrauenswürdigen Pakete beheben konnte, aber ich habe keine Ahnung Wo soll ich eine solche Konfiguration in mein SpringBoot-Projekt legen?

Die einzige Referenz, die ich auf die JMS-Warteschlange in meinem Client und meinem Server mache, ist die Einrichtung ihrer URI in application.properties und die Aktivierung von JMS auf meiner "Haupt" -Klasse mit @EnableJms, und hier ist meine Konfiguration auf dem separaten Broker :

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

Also ich würde gerne wissen, wo ich die vertrauenswürdigen Pakete angeben soll.

Thanks :)

Antwort

11

Fügen Sie die folgende Bohne:

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

Die Möglichkeit, dies über eine Konfigurationseigenschaft zu tun ist für die nächste Version hinzugefügt: https://github.com/spring-projects/spring-boot/issues/5631

+0

Thanks :) Ich hatte gerade Ihre Antwort zu bearbeiten, da 'setTrustedPackage' nur eine' Liste 'als Parameter und kein' String' nimmt. – AntoineB

+0

Doh! Entschuldigung, natürlich tut es das. Die ActiveMQConnectionFactory verfügt auch über eine setTrustAllPackages (boolean) -Methode, sodass Sie sie nicht einzeln festlegen müssen. –

11

Sie haben soeben einstellen eine der folgenden Spring-Boot-Eigenschaften in application.properties, um vertrauenswürdige Pakete festzulegen.

spring.activemq.packages.trust-all=true

oder

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

+0

Ich nehme an, dass es nur in den neueren Spring-Boot-Versionen verfügbar ist? – AntoineB

0

Ja ich fand es ist config in der neuen Version

<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

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

Beschreibung: alle Pakete hinzufügen, die u sed in senden und empfangen Message Objekt.

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

Implementated Code:

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