Я нашел этот пример в некоторых из вопросов здесь, на 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>
В чем проблема?