【问题标题】:SpringBoot + ActiveMQ - How to set trusted packages?SpringBoot + ActiveMQ - 如何设置可信包?
【发布时间】:2016-08-05 18:58:31
【问题描述】:

我正在创建两个使用 JMS 进行通信的 springboot 服务器和客户端应用程序,并且对于 activemq 的发布 5.12.1 一切正常,但是一旦我更新到 5.12.3 版本,我就会得到以下信息错误:

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.

我继续提供的the URL,我发现我的问题与 ActiveMQ 的5.12.2 版本中实现的新安全性有关,我知道我可以通过定义受信任的包来解决它,但是我不知道在我的 SpringBoot 项目中将这样的配置放在哪里。

我在客户端和服务器中对 JMS 队列的唯一参考是在 application.properties 中设置它的 URI,并使用 @EnableJms 在我的“主”类上启用 JMS,这是我在单独的配置经纪人:

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

所以我想知道我应该在哪里指定受信任的包。

谢谢:)

【问题讨论】:

    标签: java spring-boot activemq


    【解决方案1】:

    如果还有人在寻找答案,下面的 sn-p 对我有用

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

    【讨论】:

      【解决方案2】:

      我正在设置类似于下面的 Java_opts 并传递给 java 命令及其为我工作。

      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
      

      【讨论】:

        【解决方案3】:

        方法:public void setTrustedPackages(List&lt;String&gt; trustedPackages)

        描述:添加所有用于发送和接收Message对象的包。

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

        实现代码:

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

        【讨论】:

          【解决方案4】:

          是的,我在新版本中找到了它的配置

          <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
          

          【讨论】:

            【解决方案5】:

            您可以在application.properties 中设置以下 Spring Boot 属性之一来设置受信任的包。

            spring.activemq.packages.trust-all=true

            spring.activemq.packages.trusted=&lt;package1&gt;,&lt;package2&gt;,&lt;package3&gt;

            【讨论】:

            • 我认为它只在较新的 Spring-Boot 版本中可用?
            【解决方案6】:

            添加以下 bean:

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

            下一个版本添加了通过配置属性执行此操作的功能: https://github.com/spring-projects/spring-boot/issues/5631

            【讨论】:

            • 谢谢 :) 我只需要编辑你的答案,因为 setTrustedPackage 只接受 List&lt;String&gt; 作为参数,而不是 String
            • 噢!对不起,当然可以。 ActiveMQConnectionFactory 也有一个 setTrustAllPackages(boolean) 方法,所以你不必单独设置它们。
            • 我尝试了相同的解决方案,但它不适合我
            • setTrustedPackages 和 setTrustedPackage 在 2020 年不存在
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-11-10
            • 1970-01-01
            • 2018-10-10
            • 2012-10-23
            • 1970-01-01
            • 2017-04-19
            • 2016-12-08
            相关资源
            最近更新 更多