如何从封闭的Ear / lib / * .jar访问war / WEB-INF / classes?

时间:2015-03-17 18:12:20

标签: java-ee websocket ejb cdi wildfly

  +app.ear   
       +lib  
            *.jar libraries that the war's use  
       +classes  
            *.properties and other configuration files 
       +META-INF  
            application.xml  
       jbos-app.xml  
       app.war  
       app2.war  
       appn.war
  1. 从封闭的EAR的lib/*.jar调用app.war现在正在运行。
  2. 当我部署时,可以在" War"(一个来自容器,另一个来自应用程序)中看到两个单例类的实例化。
  3. 我们可以从war/WEB-INF/classes访问lib/*.jar

    大多数情况下,它会对websockets集成有所帮助,因为serverendpoint位于war文件中。

    我想获取websockets的会话并进行相应的处理。

    CDI选择访问WEB-INF / classes或WEB-INF / lib / *的原因.jar:SPEC says about accessibility of classes

    默认情况下,它设置为false,这允许子部署查看属于.ear中其他子部署的类。

    例如,请考虑以下.ear部署:

    myapp.ear  |  | --- web.war  |  | --- ejb1.jar  |  | --- ejb2.jar 如果ear-subdeployments-isolated设置为false,则web.war中的类可以访问属于ejb1.jar和ejb2.jar的类。同样,ejb1.jar中的类可以从ejb2.jar访问类(反之亦然)。

    The ear-subdeployments-isolated element value has no effect on the isolated classloader of the .war file(s). i.e. irrespective of whether this flag is set to true or false, the .war within a .ear will have a isolated classloader and other sub-deployments within that .ear will not be able to access classes from that .war. This is as per spec.
    

    编辑2:

    通过基于Bruno博客的CDI实现尝试了所有这些东西

    https://blogs.oracle.com/brunoborges/entry/integrating_websockets_and_jms_with

    部署完整的Ear文件面临的问题

    下面的课是将事件发送到war / WEB-INF / classes /

    import javax.ejb.Stateless;
    import javax.enterprise.event.Event;
    import javax.enterprise.inject.spi.InjectionPoint;
    import javax.inject.Inject;
    import javax.inject.Named;
    import javax.jms.Message;
    import javax.websocket.Session;
    
    import org.springframework.stereotype.Component;
    
    @Component
    @Stateless
    @Named
    public class WebsocketMessenger {
    
    
    
        @Inject
        @MessageEvent
        private Event<Message> events;
    
    
    
         public void sendMessageToWebsockets(String rawMessage, Session session){
    
    
             RawMessageEvent rawMessageEvent = new RawMessageEvent(rawMessage, session);
    
     //     events.fire();
    
         }
    
     } 
    
    
    
    
       import javax.ejb.Stateless;
       import javax.enterprise.event.Observes;
       import javax.inject.Named;
    
    
    
    
     @Stateless
       @Named
    
    
       public class RawMessageListener {
    
         public void listenToTheRawMessage(@Observes @MessageEvent RawMessageEvent rawMessageEvent){
            System.out.println("Received: " + rawMessageEvent);
         }
    
     }
    

    以下是异常追踪:

    [org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor](MSC服务主题1-8)JSR-330&#39; javax.inject.Inject&#39;找到并支持自动装配的注释 2015-03-19 11:08:39,085 WARN [org.springframework.web.context.support.XmlWebApplicationContext](MSC服务线程1-8)在上下文初始化期间遇到异常 - 取消刷新尝试:org.springframework.beans.factory。 BeanCreationException:使用名称&#39; messenger&#39;创建bean时出错:注入自动连接的依赖项失败;嵌套异常是org.springframework.beans.factory.BeanCreationException:无法自动装配字段:javax.enterprise.event.Event XXXX.HelloMessenger.events;嵌套异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:没有为依赖项找到类型为[javax.enterprise.event.Event]的限定bean:期望至少有一个bean可以作为此依赖项的autowire候选者。依赖注释:{@ javax.inject.Inject()}

    引起:org.springframework.beans.factory.BeanCreationException:无法自动装配字段:javax.enterprise.event.Event XXXX.HelloMessenger.events;嵌套异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:没有为依赖项找到类型为[javax.enterprise.event.Event]的限定bean:期望至少有一个bean可以作为此依赖项的autowire候选者。依赖注释:{@ javax.inject.Inject()}     at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:555)     在org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)     在org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331)     ......还有22个

1 个答案:

答案 0 :(得分:0)

摆脱CDI事件处理,尝试使用war / WEB-INF / classes的远程ejb通信。

它的工作! ,我可以与war文件背后的类进行交流。

如果有人回答了CDI,那么我们将不胜感激。