2014-12-13 2 views
0

이 질문에 대한 답변이 이미 전달되었습니다. 의도 한대로 작동하지 않는 샘플 코드가 있습니다. 스프링 주석 @Autowired이 작동하지 않습니다. 내가 @Inject이 같은 설정에서 반면 용접 1.1.0과 톰캣 6봄 @Autowired 속성이 null입니다.

WorkTester.java

//1. Do I need to mark some class as component to wire a property in that class? Intellij 
    //always warns if I don't. 
    @Component 
    public class WorkTester { 

     @Autowired 
     @Qualifier("work") 
     private Work work; 
     //2. There is a bean in MVC context with name work. Why doesn't it work? 

     public void testWork() { 
      System.out.println("Work : " + work); 
     } 

     public Work getWork() { 
      return work; 
     } 

     //2. If there is a bean called 'work' in any of the contexts, do I need setters? 
     public void setWork(Work work) { 
      this.work = work; 
     } 
    } 

WorkImpl.java

public class WorkImpl implements Work { 

    @Override 
    public void doWork(String task) { 
     System.out.println("Yahoo! " + task); 
    } 
} 

내가 applicationContext.xml을 가지고 작업, 그것은 비어 있습니다. 내 dispatcher-servet.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 

    <context:component-scan base-package="com.brs.in"/> 

    <bean id="work" class="com.brs.in.WorkImpl"/> 
</beans> 

web.xml에입니다 :

코멘트에서 언급 한 바와 같이
<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 
    <display-name>Archetype Created Web Application</display-name> 
    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

    <servlet> 
     <servlet-name>dispatcher</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>dispatcher</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 

    <listener> 
     <listener-class>org.jboss.weld.environment.servlet.Listener</listener-class> 
    </listener> 

    <servlet> 
     <servlet-name>test</servlet-name> 
     <servlet-class>com.brs.in.HelloWorldServlet</servlet-class> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>test</servlet-name> 
     <url-pattern>/test</url-pattern> 
    </servlet-mapping> 

    <resource-env-ref> 
     <resource-env-ref-name>BeanManager</resource-env-ref-name> 
     <resource-env-ref-type>javax.enterprise.inject.spi.BeanManager</resource-env-ref-type> 
    </resource-env-ref> 
</web-app> 

에서 autowiring 인 이유 (질문 1, 2, 3) 코드의 첫 번째 코드에서, 사람이 대답 할 수 작동 안함?

진입 점은 :

이 내가 NullPointerException를 일으키는 방법 호출하고있는 샘플 서블릿입니다 : 충분히

@Inject 
    private Work worker; 

    @Override 
    protected void doGet(HttpServletRequest servletRequest, HttpServletResponse servletResponse) throws ServletException, IOException { 

     System.out.println("Worker has been injected " + ((worker != null))); 

     worker.doWork(1, 2);//No Problem 

     new WorkTester().testWork();//Causing trouble 

    } 
+0

당신은 그것이 의도 한대로 작동하지 않는다고 말했습니다. 실제로는 어떻게됩니까? – benji

+0

@benji work는 항상 null입니다. – phoenix

+0

kamoor

답변

-1

가 혼자 dispatcher-servlet.xml<context:annotation-config/> @Autowired 주석이 포함을하지 않는 경우에 필요 그것을 가능하게하십시오. Ref.

<context:component-scan base-package="com.brs.in"/> 내가 아는 한 그 컨트롤러를 스캔하는 데 사용됩니다. 그래도 확실하지는 않습니다.

web.xml에서 발송자를 만드는 방법에 대해 알아두면됩니다.

<servlet> 
    <servlet-name>dispatcher</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>WEB-INF/spring/dispatcher-servlet.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>dispatcher</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

spec.

로드 - 온 - 시작 요소는이 서블릿은 이 (인스턴스화라고 몇개의 init()가)로로드합니다 웹 응용 프로그램의 시작에를해야 함을 나타냅니다. 이 요소의 선택적 내용은 서블릿을로드해야하는 순서를 나타내는 정수 여야합니다. 값이 음의 정수이거나 요소가없는 경우 컨테이너는 선택할 때마다 서블릿을 자유롭게로드 할 수 있습니다. 값이 양수 128 정수 또는 0 인 경우 컨테이너는 응용 프로그램이 배포 될 때로드하고 서블릿을 초기화해야합니다 ( ). 컨테이너 은 서블릿이 더 높은 정수로 표시되기 전에 낮은 정수로 표시된 서블릿이 으로로드되도록 보장해야합니다. 컨테이너는 동일한로드시 시작 값을 사용하여 서블릿로드 순서를 으로 선택할 수 있습니다.

+0

아니요. 나는 똑같이 노력했다. 아직도 부동산 업무는 null입니다. – phoenix

+0

component-scan은 주석 설정의 슈퍼 세트입니다. – phoenix

+0

'@Qualifier ("work")'를 삭제하려고합니다. 확실하지 않습니다. – Secondo

관련 문제