SimpMessagingTemplate dsnt получает сообщения в аннотированной версии Spring в Tomcat - PullRequest
0 голосов
/ 18 октября 2018

Я нашел этот пример в некоторых из вопросов здесь, на StackOverflow - https://github.com/gerrytan/wsproblem. И этот пример отлично работает на моем пристани.

Итак, я решил сбежать из xml и выполнить рефакторинг этогопример аннотации и Tomcat.Вот что я получил сейчас:

Мой MVCConfig:

public class MVCConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
    }

    @Bean
    public InternalResourceViewResolver jspViewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setOrder(1);
        viewResolver.setPrefix("/WEB-INF/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }
}

My Root Config:

@Configuration
@ComponentScan(basePackages = { "com.javamaster.controller"}, excludeFilters={
        @ComponentScan.Filter(type = FilterType.ANNOTATION, value = Controller.class)
})
@Import({SecurityConfig.class, WebSocketConfig.class})
public class RootConfig {    
}

Моя конфигурация безопасности:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .passwordEncoder(NoOpPasswordEncoder.getInstance())
                .withUser("bob").password("1234").roles("USER");
    }
    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.authorizeRequests()
                .antMatchers("/login/**").access("hasRole('IS_AUTHENTICATED_ANONYMOUSLY')")
                .antMatchers("/resources/**").access("hasRole('ROLE_USER')")
                .antMatchers("/**").access("hasRole('ROLE_USER')")
                .and().formLogin().defaultSuccessUrl("/", false);
    }

Моя веб-конфигурация:

public class WebConfig extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
        rootContext.register(RootConfig.class, SecurityConfig.class);
        servletContext.addListener(new ContextLoaderListener(rootContext));
        AnnotationConfigWebApplicationContext servletAppContext = new AnnotationConfigWebApplicationContext();
        servletAppContext.register(MVCConfig.class);
        DispatcherServlet dispatcherServlet = new DispatcherServlet(servletAppContext);
        dispatcherServlet.setThrowExceptionIfNoHandlerFound(true);
        ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", dispatcherServlet);
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/");
    }

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] {AppSecurityConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[0];
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[0];
    }

Моя конфигурация WebSocket:

  @Configuration
    @EnableWebSocketMessageBroker
    public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {


        @Override
        public void configureMessageBroker(MessageBrokerRegistry config) {
            config.enableSimpleBroker("/topic", "/user");
            config.setApplicationDestinationPrefixes("/app");
        }

        @Override
        public void registerStompEndpoints(StompEndpointRegistry registry) {
            registry.addEndpoint("/ws").withSockJS();
        }
}

Мой контроллер:

@Controller
@RequestMapping("/")
public class HomeController {
    @Autowired
    private SimpMessagingTemplate simpMessagingTemplate;
    @RequestMapping(method = RequestMethod.GET)
    public String home() {
        System.out.println("WE ARE HERE....");
        return "home";
    }
    @MessageMapping("/greeting")
    public void greeting(Principal principal) throws Exception {

        String reply = "hello " + principal.getName();
        System.out.println("sending " + reply);
        simpMessagingTemplate.convertAndSendToUser(principal.getName(), "/reply", reply);
    }
}

И что у меня в Explorer Console:

Открытие веб-сокета ... топать.js: 130 Web Socket Opened ... stomp.js: 130 >>> CONNECT логин: гостевой пароль: guest accept-version: 1.1,1.0 heart-beat: 10000,10000

Итак, каквы видите - все работает нормально, но @MessageMapping ("/ приветствие") не работает, System.out.println ("отправка" + ответ) не печатает что-либо в консоли IDEA, поэтому в данном случае этот метод не вызывается.Зачем?Но в версии на GITHub для XML и Jetty я получил в консоли:

<<< Тип сообщения MESSAGE: application / json; charset = UTF-8 подписка: идентификатор сообщения sub-0: tmapc8ak-0 destination: / user / bob / reply content-length: 11 "hello bob" </p>

В чем проблема?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...