Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can';t访问弹簧引导控制器中的Roadcaster_Java_Spring_Spring Boot_Atmosphere_Java Websocket - Fatal编程技术网

Java Can';t访问弹簧引导控制器中的Roadcaster

Java Can';t访问弹簧引导控制器中的Roadcaster,java,spring,spring-boot,atmosphere,java-websocket,Java,Spring,Spring Boot,Atmosphere,Java Websocket,我使用SpringBoot(1.3.2)和Atmosphere(2.4.2)设置了一个简单的聊天应用程序 这是我的WebSocketConfigurer: package com.chat.shared.websocket; import java.util.Collections; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRe

我使用SpringBoot(1.3.2)和Atmosphere(2.4.2)设置了一个简单的聊天应用程序

这是我的
WebSocketConfigurer

package com.chat.shared.websocket;

import java.util.Collections;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
import org.apache.catalina.Context;
import org.apache.tomcat.websocket.server.WsSci;
import org.atmosphere.cpr.AtmosphereFramework;
import org.atmosphere.cpr.AtmosphereServlet;
import org.atmosphere.cpr.MetaBroadcaster;
import org.springframework.boot.context.embedded.ServletContextInitializer;
import org.springframework.boot.context.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.chat.privatechat.ChatChannel;

@Configuration
public class WebSocketConfigurer implements ServletContextInitializer {

  @Bean
  public TomcatEmbeddedServletContainerFactory tomcatContainerFactory() {
    TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
    factory.setTomcatContextCustomizers(Collections.singletonList(tomcatContextCustomizer()));
    return factory;
  }

  @Bean
  public TomcatContextCustomizer tomcatContextCustomizer() {
    return new TomcatContextCustomizer() {
      @Override
      public void customize(Context context) {
        context.addServletContainerInitializer(new WsSci(), null);
      }
    };
  }

  @Bean
  public AtmosphereServlet atmosphereServlet() {
    return new AtmosphereServlet();
  }

  @Bean
  public AtmosphereFramework atmosphereFramework() {
    return atmosphereServlet().framework();
  }

  @Bean
  public MetaBroadcaster metaBroadcaster() {
    AtmosphereFramework framework = atmosphereFramework();
    return framework.metaBroadcaster();
  }

  @Override
  public void onStartup(ServletContext servletContext) throws ServletException {
    configureAtmosphere(atmosphereServlet(), servletContext);
  }

  private void configureAtmosphere(AtmosphereServlet servlet, ServletContext servletContext) {
    ServletRegistration.Dynamic reg = servletContext.addServlet("atmosphereServlet", servlet);

    reg.setInitParameter("org.atmosphere.cpr.packages", ChatChannel.class.getPackage().getName());
    reg.setInitParameter("org.atmosphere.cpr.broadcasterClass", "org.atmosphere.plugin.hazelcast.HazelcastBroadcaster");
    reg.setInitParameter("org.atmosphere.cpr.broadcaster.maxProcessingThreads", "10");
    reg.setInitParameter("org.atmosphere.cpr.broadcaster.maxAsyncWriteThreads", "10");
    reg.setInitParameter("org.atmosphere.interceptor.HeartbeatInterceptor.clientHeartbeatFrequencyInSeconds", "10");
    servletContext.addListener(new org.atmosphere.cpr.SessionSupport());
    reg.addMapping("/chat/*");
    reg.setLoadOnStartup(0);
    reg.setAsyncSupported(true);
  }
}
package com.chat.privatechat;

import java.util.List;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import com.chat.privatechat.DTOs.ChatMessageDTO;
import com.chat.privatechat.DTOs.ChatSessionInitializationDTO;
import com.chat.privatechat.DTOs.EstablishedChatSessionDTO;
import com.chat.shared.http.JSONResponseHelper;
import com.chat.user.UserService;
import com.chat.user.exceptions.IsSameUserException;
import com.chat.user.exceptions.UserNotFoundException;
import com.chat.user.strategies.UserRetrievalByIdStrategy;

@Controller
public class ChatController {
  @Autowired
  private ChatService chatService;

  @Autowired
  private BeanFactory beanFactory;

  @Autowired
  private UserService userService;

  @Inject
  private MetaBroadcaster metaBroadcaster;

  @RequestMapping(value="/api/chat/session", method=RequestMethod.PUT, produces="application/json", consumes="application/json")
  public ResponseEntity<String> establishChatSession(@RequestBody ChatSessionInitializationDTO initialChatSession) throws IsSameUserException, BeansException, UserNotFoundException { 
     ...
  }

  @RequestMapping(value="/api/chat/session/{channelUuid}", method=RequestMethod.GET, produces="application/json")
  public ResponseEntity<String> getExistingChatSessionMessages(@PathVariable("channelUuid") String channelUuid) {
    ...
  }
}
下面是我目前如何在
聊天频道中利用它的:

package com.chat.privatechat;

import com.chat.privatechat.DTOs.ChatMessageDTO;
import com.chat.shared.localmessagebus.LocalMessage;
import com.chat.shared.localmessagebus.LocalMessageBus;
import org.atmosphere.config.service.Disconnect;
import org.atmosphere.config.service.Get;
import org.atmosphere.config.service.ManagedService;
import org.atmosphere.config.service.PathParam;
import org.atmosphere.config.service.Ready;
import org.atmosphere.cpr.AtmosphereResource;
import org.atmosphere.cpr.AtmosphereResourceEvent;
import org.atmosphere.cpr.AtmosphereResourceFactory;
import org.atmosphere.cpr.BroadcasterFactory;
import org.atmosphere.cpr.MetaBroadcaster;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import javax.inject.Inject;

@ManagedService(path = "/chat/{channel: [a-zA-Z][a-zA-Z_0-9]*}")
public class ChatChannel {
  @PathParam("channel")
  private String channelUuid;

  @Inject
  private BroadcasterFactory factory;

  @Inject
  private AtmosphereResourceFactory resourceFactory;

  @Inject
  private MetaBroadcaster metaBroadcaster;

  @Get
  public void init(AtmosphereResource resource) {
    resource.getResponse().setCharacterEncoding(StandardCharsets.UTF_8.name());
  }

  @Ready
  public void onReady(final AtmosphereResource resource) {
      String userId = resource.getRequest().getHeader("userId");
      System.out.println("User " + userId + " has connected.");
  }

  @Disconnect
  public void onDisconnect(AtmosphereResourceEvent event) {
      String userId = event.getResource().getRequest().getHeader("userId");
      System.out.println("User " + userId + " has disconnected");
  }

  @org.atmosphere.config.service.Message(encoders = MessageEncoderDecoder.class, decoders = MessageEncoderDecoder.class)
  public ChatMessageDTO onMessage(ChatMessageDTO chatMessage) throws IOException {
      LocalMessageBus.manager().send(new LocalMessage<ChatMessageDTO>(chatMessage));

      return chatMessage;
  }
}
注入/自动连线
MetaBroadcaster
或从
BeanFactory
工作引入
MetaBroadcaster
bean。我找了又找,找不到好的解决办法。在今年春天的
Controller
context环境中,似乎无法访问中的bean,我已经没有想法了

谢谢你的任何意见

注:这些是我的大气DEP:

<dependency>
  <groupId>org.atmosphere</groupId>
  <artifactId>atmosphere-runtime</artifactId>
  <version>2.4.2</version>
</dependency>

<dependency>
  <groupId>org.atmosphere</groupId>
  <artifactId>atmosphere-spring</artifactId>
  <version>2.4.2</version>
</dependency>

<dependency>
  <groupId>org.webjars</groupId>
  <artifactId>atmosphere-javascript</artifactId>
  <version>2.2.3</version>
</dependency>

<dependency>
  <groupId>org.atmosphere</groupId>
  <artifactId>atmosphere-hazelcast</artifactId>
  <version>2.4.2</version>
</dependency>

组织气氛
大气运行时间
2.4.2
组织气氛
大气泉
2.4.2
org.webjars
大气javascript
2.2.3
组织气氛
大气hazelcast
2.4.2

我的电脑上也有同样的问题side@markusf我联系了该项目的主要开发人员寻求帮助-他友好地查看了我的跟踪日志,并告诉我在ML上发布,因为有一些Spring专家在那里帮忙。-有解决方案时将更新SO post