Не удается заставить аннотацию @Resource работать в Springboot - PullRequest
0 голосов
/ 07 мая 2020

Я работал над проектом с Websockets, и мне нужен был один и тот же HashMap в нескольких классах и потоках. Прочитав немного, я понял, что лучше всего использовать аннотацию @Resource. Но я не могу заставить его работать, и я получаю только null при печати String и получаю NullPointerException, когда что-либо делаю с ConcurrentHashMap. Вот часть кода.

SocketHandler. java

@Component
public class SocketHandler extends TextWebSocketHandler {

    @Resource(name = "teststring")
    private String testString;

    private ConcurrentHashMap<WebSocketSession, UserPlayer> sessions;

    @Resource(name="sessions")
    public void setSessions(ConcurrentHashMap<WebSocketSession, UserPlayer> sessions){
        System.out.println("Im in @resource");
        this.sessions=sessions;
    }

    @Override
    public void afterConnectionEstablished(final WebSocketSession session) throws Exception {
        System.out.println(testString);
        sessions.put(session, new UserPlayer());
        System.out.println("Got connection " + session);
    }
}

AplicationContextResource. java

@Configuration
public class ApplicationContextResource{

    @Bean(name="sessions")
    public ConcurrentHashMap<WebSocketSession, UserPlayer> sessions(){
        ConcurrentHashMap<WebSocketSession, UserPlayer> sessions = new  ConcurrentHashMap<WebSocketSession, UserPlayer>();
        System.out.println("bean sessions!!");
        return sessions;
    }

    @Bean(name="teststring")
    public String testString(){
        String str = new String("12345");
        return str;
    }
}

BeanPostPro c. java

@Configuration
public class BeanPostProc {

    @Bean
    public CommonAnnotationBeanPostProcessor commonAnnotationBeanPostProcessor(){
        CommonAnnotationBeanPostProcessor cBeanPostProcessor = new CommonAnnotationBeanPostProcessor();
        cBeanPostProcessor.setAlwaysUseJndiLookup(true);
        return cBeanPostProcessor;
    }
}

И это вывод консоли после запуска сервера и подключения клиента.

020-05-07 22:03:28.417  INFO 3132 --- [           main] com.soluna.slith.DemoApplication         : Starting DemoApplication on Racunalo with PID 3132 (D:\Git\slytherin\server\slith\target\classes started by Sebastijan in d:\Git\slytherin\server\slith)
2020-05-07 22:03:28.421  INFO 3132 --- [           main] com.soluna.slith.DemoApplication         : No active profile set, falling back to default profiles: default
2020-05-07 22:03:29.395  INFO 3132 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'beanPostProc' of type [com.soluna.slith.config.BeanPostProc$$EnhancerBySpringCGLIB$$524027f] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-05-07 22:03:29.758  INFO 3132 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2020-05-07 22:03:29.771  INFO 3132 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2020-05-07 22:03:29.772  INFO 3132 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.30]
2020-05-07 22:03:29.874  INFO 3132 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2020-05-07 22:03:29.875  INFO 3132 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1365 ms
bean sessions!!
Im in @resource
2020-05-07 22:03:30.193  INFO 3132 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2020-05-07 22:03:30.458  INFO 3132 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2020-05-07 22:03:30.461  INFO 3132 --- [           main] com.soluna.slith.DemoApplication         : Started DemoApplication in 2.511 seconds (JVM running for 3.154)
2020-05-07 22:04:31.705  INFO 3132 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2020-05-07 22:04:31.705  INFO 3132 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2020-05-07 22:04:31.722  INFO 3132 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 17 ms
null
2020-05-07 22:04:31.808 ERROR 3132 --- [nio-8080-exec-1] w.s.h.ExceptionWebSocketHandlerDecorator : Closing session due to exception for StandardWebSocketSession[id=6aedf417-075a-851d-bb92-16e32ef76915, uri=ws://localhost:8080/game]

java.lang.NullPointerException: null
    at com.soluna.slith.controller.SocketHandler.afterConnectionEstablished(SocketHandler.java:65) ~[classes/:na]

В моем проекте нет XML, во всех примерах показана конфигурация bean-компонента на основе XML. Пробовал с .setAlwaysUseJndiLookup и без него (true). Я как-то испортил bean-компонент CommonAnnotationBeanPostProcessor?

1 Ответ

0 голосов
/ 10 мая 2020

Прочитав и попробовав множество вещей, я наконец нашел ошибку. Ошибка не в любом из вышеперечисленных классов, а в конфигурации WebSocket. BeanPostPro c. java с CommonAnnotationBeanPostProcessor даже не требуется.

Конфигурация WebSocket до :

@Configuration 
@EnableWebSocket 
public class WebSocketConfig implements WebSocketConfigurer {

    @Override 
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new SocketHandler(), "/game").setAllowedOrigins("*");
    }
  }

Конфигурация WebSocket сейчас :

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Autowired
    private SocketHandler socketHandler;

    @Override 
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(socketHandler, "/game").setAllowedOrigins("*");
    }
}

Ошибка заключалась в том, что я создавал новый экземпляр SocketHandler, который не управлялся Spring и не был правильно подключен автоматически. Инъекции компонентов работают с аннотациями @Resource и @Autowired после исправления ошибки.

...