2013-04-29 2 views
0

자바 측에서 소켓을 생성하는 클래스가 있습니다. 문제는 실제로 내 설정을 통해 검색되고,이 클래스에있는 java.lang.IllegalArgumentException: No bean found for class com.production.workflow.process.approval.ApprovalSocketHandler@Component와 @Bean에도 불구하고 클래스에 대한 빈을 찾지 못했습니다.

package com.production; 

@WebListener 
public class SocketInitializer implements ServletContextListener { 

    public static App app; 

    @Override 
    public void contextInitialized(ServletContextEvent servletContextEvent) { 
     AutowireCapableBeanFactory beanFactory = ApplicationContextProvider.getApplicationContext().getAutowireCapableBeanFactory(); 
     app = new App(new Options().url("/socket/workstation/approval").packageOf(this), new AtmosphereModule(servletContextEvent.getServletContext()), new SpringModule(beanFactory)); 
     app.bean(ApprovalSocketHandler.class).init(); 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent servletContextEvent) { 

    } 
} 

패키지를 던지고 있다는 점이다. 그 시점에서이 수신기가 아직 초기화되지 않은 것으로 의심됩니다.

@Configuration 
@ComponentScan(basePackages = { 
     "com.production" 
}) 
@PropertySource(value= { 
     "classpath:/application.properties", 
     "classpath:/environment-${MY_ENVIRONMENT}.properties" 
}) 
@EnableJpaRepositories("com.production.repository") 
@EnableTransactionManagement 
public class Config { 
    @Value("${db.url}") 
    String PROPERTY_DATABASE_URL; 
    @Value("${db.user}") 
    String PROPERTY_DATABASE_USER; 
    @Value("${db.password}") 
    String PROPERTY_DATABASE_PASSWORD; 

    @Value("${persistenceUnit.default}") 
    String PROPERTY_DEFAULT_PERSISTENCE_UNIT; 

    @Value("${hibernate.dialect}") 
    String PROPERTY_HIBERNATE_DIALECT; 
    @Value("${hibernate.format_sql}") 
    String PROPERTY_HIBERNATE_FORMAT_SQL; 
    @Value("${hibernate.show_sql}") 
    String PROPERTY_HIBERNATE_SHOW_SQL; 
    @Value("${entitymanager.packages.to.scan}") 
    String PROPERTY_ENTITYMANAGER_PACKAGES_TO_SCAN; 

    @Bean 
    public App app() { 
     return SocketInitializer.app; 
    } 

이 클래스가 ServletContextListener 실행 중 빈인지 확인하려면 어떻게해야합니까?

+0

'ServletContextListener's는 서블릿 컨테이너에 의해로드되고 등록됩니다. –

+0

@SotiriosDelimanolis -이 시나리오에서 그 의미는 무엇입니까? – Webnet

+0

서블릿 컨테이너는 Spring이 처리하기 전에 처리하므로, 'contextInitialized'에서 빈을 사용할 수 없다. 나는 당신을위한 솔루션을 가지고 있지 않습니다. –

답변

1

인터페이스 ServletContextAware이 당신이 찾고있는 것입니다. Spring이 어플리케이션 컨텍스트를 주입하기 위해 사용할 메소드

setServletContext(ServletContext servletContext) 

을 제공합니다. 귀하의 경우 서블릿 컨테이너에 의해 생성 된 ServletContext이됩니다.

ServletContextListener은 봄이 아닌 서블릿 컨테이너에 의해 초기화되기 때문에 질문에 대답으로 사용하지 마십시오. 봄은 마술을 할 수 없다.

관련 문제