2014-01-17 4 views
1

간단한 것을 놓치고 있어야하지만, Autowired 속성을 빈에 할당하는 데 문제가 있습니다. = 구성 요소 스캔 기본 패키지 "..."/ > 웹 서비스에서 Autowired가 작동하지 않습니다.

  • applicationContext.xml에 :
  • 사용 < 컨텍스트를 SpringBeanAutowiringSupport을 확장

    1. : 여기에 게시 된 모든 유사한 응답은 3 가지 솔루션을 중심으로 돌고있는 것 같다

    applicationContext.xml

  • 에 주석 - 설정/> 내 DAO를 대표하고 웹 서비스에 주입 할 수있는 최소한의 빈을 만들려고 : < 컨텍스트를 사용합니다.

    DAO 인터페이스 :

    package wb; 
    public interface FooDAO { 
        public String doNothing(); 
    } 
    

    DAO 구현 : 분사

    package wb; 
    import org.springframework.stereotype.Component; 
    
    @Component 
    public class FooDAOImpl implements FooDAO { 
        public FooDAOImpl() { 
         System.out.println("FooDAOImpl: Instantiated " + this); 
        } 
    
        @Override 
        public String doNothing() { 
         System.out.println("FooDAOImpl: doNothing() called"); 
         return "Did nothing!"; 
        } 
    } 
    

    웹 서비스 : 콩 태그 내에서

    package ws; 
    
    import javax.jws.WebService; 
    import javax.jws.WebMethod; 
    import javax.jws.WebResult; 
    import org.springframework.beans.factory.annotation.Autowired; 
    import org.springframework.web.context.support.SpringBeanAutowiringSupport; 
    import wb.FooDAO; 
    
    @WebService(serviceName = "WS") 
    public class WS extends SpringBeanAutowiringSupport { 
    
        @Autowired(required = true) 
        private FooDAO fooDAO; 
    
        @WebMethod(exclude = true) 
        public void setFooDAO(FooDAO fooDAO) { 
         this.fooDAO = fooDAO; 
         System.out.println("WS: fooDAO set = " + fooDAO); 
        } 
    
        public WS() { 
         System.out.println("WS: WS bean instantiated!"); 
        } 
    
        @WebMethod(operationName = "doNothing") 
        @WebResult(name = "whatDidIDo") 
        public String doNothing() { 
         System.out.println("WS: doNothing() says DAO = " + fooDAO); 
         return fooDAO == null ? "Could not do nothing!" : fooDAO.doNothing(); 
        } 
    } 
    

    applicationContext.xml 내용 :

    <context:annotation-config /> 
    <context:component-scan base-package="ws"/> 
    
    <bean id="fooDAO" class="wb.FooDAOImpl" /> 
    

    이것은 모두 Spring과 Hibernate 프레임 워크로 생성 된 프로젝트의 최신 NetBeans에서 생성되었습니다. 나는 보스에 배포하고, 응용 프로그램이 시작되면, 내가 예상 콩 인스턴스화 얻을 : 나는 웹 서비스를 호출하면

    11:01:46,767 INFO [stdout] (MSC service thread 1-6) WS: WS bean instantiated! 
    11:01:47,571 INFO [stdout] (MSC service thread 1-15) FooDAOImpl: Instantiated [email protected] 
    

    을, 로그도보고 : 나는 무엇을 놓치고

    11:03:07,097 INFO [stdout] (http--127.0.0.1-8080-1) WS: doNothing() says DAO = null 
    

    ?

    답변

    4

    SpringBeanAutowiringSupport은 빈이어야합니다. 해당 클래스에 @Service 또는 구성 요소 검색이 발생할 때 클래스가 Bean이어야 함을 나타내는 @Component과 같은 다른 주석으로 주석을 추가해야합니다. 이들은 Spring에 의해 주워지고 콩으로 만들어집니다.

    다른 Bean을 삽입하는 것과 같이 자동 와이어 링에 참여하려면 클래스 자체가 Bean이어야하며 Spring의 IOC 컨테이너에서 관리해야합니다.

    +1

    감사합니다. 그것이 이전에 시도했던 것들 중 하나라고 맹세 할 수 있습니다. @Component를 추가하면 작동합니다. – user3207820

    +0

    @ user3207820 기꺼이 도와 드리겠습니다. 나는 Spring을 사용할 때 초기에 같은 개념으로 고심했다. 언제든지'new' 키워드를 사용하면 잠시 멈추고 궁금해 할 필요가 있습니다. –

    +2

    응용 프로그램 시작 중에 작성된 WS 인스턴스는 자동 배선 DAOImpl을 가져옵니다. 그러나 웹 서비스를 호출 할 때 요청을 처리하기 위해 다른 WS 인스턴스가 만들어지며 그 인스턴스는 인스턴스를 가져 오지 않습니다. 기묘한. 어쨌든, 다시 한번 감사드립니다. – user3207820

    관련 문제