2014-11-04 2 views
1

내 서블릿 클래스에서 Spring 컨텍스트를 가져 오는 데 문제가 있습니다. 메서드는 테스트에서 잘 작동합니다 (컨텍스트가로드 된 상태에서). 하지만 난 내 webapp에서 컨텍스트를로드 할 수없는 것 같습니다.web.xml과 Tomcat을 사용하여 Spring 컨텍스트를 올바르게로드하는 방법

<?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" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation=" 
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd 
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> 
    <context:annotation-config /> 
    <import resource="classpath*:/test-prova-spring-configuration.xml" /> 
</beans> 

파일 테스트 PROVA-스프링의 configuration.xml 수입의 시리즈를 포함 : 이것은 내 응용 프로그램 컨텍스트 app-config.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> 
<display-name>AgneseProva</display-name> 
<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value> 
     /WEB-INF/spring/app-config.xml 
    </param-value> 
</context-param> 
<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 
<servlet> 
<description></description> 
<display-name>Prova</display-name> 
<servlet-name>Prova</servlet-name> 
<servlet-class>it.jenia.agnese.prova.Prova</servlet-class> 
</servlet> 
<servlet> 
<description></description> 
<display-name>Presenze</display-name> 
<servlet-name>Presenze</servlet-name> 
<servlet-class>it.jenia.agnese.prova.Presenze</servlet-class> 
</servlet> 
<servlet-mapping> 
<servlet-name>Prova</servlet-name> 
<url-pattern>/Prova</url-pattern> 
</servlet-mapping> 
<servlet-mapping> 
<servlet-name>Presenze</servlet-name> 
<url-pattern>/Presenze</url-pattern> 
</servlet-mapping> 
</web-app> 

입니다 : 내가 여기에 톰캣 7을 사용하고있어 내 web.xml 파일입니다 데이터베이스 구성, 저장소 구성, 엔티티 및 서비스와 관련된 정보를 제공합니다.

package it.jenia.agnese.prova; 

import it.jenia.ac.mail.rapportini.repository.CollaboratoreRepository; 
import it.jenia.ac.mail.rapportini.repository.PresenzaRepository; 
import it.jenia.vr.common.service.JspReporter; 

import java.io.IOException; 

import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.apache.log4j.Logger; 
import org.springframework.beans.factory.annotation.Autowired; 

public class Presenze extends HttpServlet { 
private static final long serialVersionUID = 1L; 
private static Logger logger = Logger.getLogger(Presenze.class); 

@Autowired 
CollaboratoreRepository collaboratoreRepository; 
@Autowired 
PresenzaRepository presenzaRepository; 
@Autowired 
JspReporter jsp; 

public Presenze() { 
    super(); 
} 
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    String messaggiojsp = "ok"; 
    String messaggiopr = "ok"; 
    String messaggiocr = "ok"; 
    if (jsp==null){ 
     messaggiojsp = "ko"; 
    } 
    request.setAttribute("messaggiojsp", messaggiojsp); 
    if(presenzaRepository ==null){ 
     messaggiopr = "ko"; 
    } 
    request.setAttribute("messaggiopr", messaggiopr); 
    if(collaboratoreRepository==null){ 
     messaggiocr = "ko"; 
    } 
    request.setAttribute("messaggiocr", messaggiocr); 
    request.getRequestDispatcher("/Presenze/presenze.jsp").forward(request, response); 
} 
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    // TODO Auto-generated method stub 
} 

} 

이 서버는 단지 상황이 완전히로드 인 경우와 같은 오류가 발생하지 않지만, autowire가 필드는 서블릿에서 널 (null)입니다

서블릿 클래스입니다. 지금까지 나는 시도했다 :

1. 서블릿을 @Service 어노테이션으로 서비스로 등록하고 패키지를 스프링 구성 파일 (test-prova-spring-configuration.xml)의 구성 요소 스캔에 추가한다. > 아무것도 변경되지 않았습니다. 필드는 null이고 Tomcat은 오류를 발생시키지 않았습니다.

2. 스프링 구성 파일에서 bean으로 서블릿을 등록하십시오. -> 아무 것도 변경되지 않았습니다. 필드는 null이고 Tomcat은 오류를 발생시키지 않았습니다.

서블릿에 코드의 그 세 줄을 3.Adding : - :

org.springframework.beans.factory.BeanCreationException : 사출

public void init(javax.servlet.ServletConfig config) throws ServletException { 
    SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, config.getServletContext()); 
}; 

> 페이지가 (마침내) 오류가 발생 클래스에 대한 autowired 종속성 실패 [class it.jenia.agnese.prova.Presenze];

역 추적 :

exception 

javax.servlet.ServletException: Servlet.init() for servlet Presenze threw exception 
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503) 
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) 
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421) 
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070) 
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) 
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314) 
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    java.lang.Thread.run(Thread.java:745) 

root cause 

org.springframework.beans.factory.BeanCreationException: Injection of autowired dependencies failed for class [class it.jenia.agnese.prova.Presenze]; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: it.jenia.ac.mail.rapportini.repository.CollaboratoreRepository it.jenia.agnese.prova.Presenze.collaboratoreRepository; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [it.jenia.ac.mail.rapportini.repository.CollaboratoreRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
    org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.processInjection(AutowiredAnnotationBeanPostProcessor.java:306) 
    org.springframework.web.context.support.SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(SpringBeanAutowiringSupport.java:110) 
    it.jenia.agnese.prova.Presenze.init(Presenze.java:45) 
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503) 
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) 
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421) 
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070) 
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) 
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314) 
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    java.lang.Thread.run(Thread.java:745) 

root cause 

org.springframework.beans.factory.BeanCreationException: Could not autowire field: it.jenia.ac.mail.rapportini.repository.CollaboratoreRepository it.jenia.agnese.prova.Presenze.collaboratoreRepository; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [it.jenia.ac.mail.rapportini.repository.CollaboratoreRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
    org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:514) 
    org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) 
    org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.processInjection(AutowiredAnnotationBeanPostProcessor.java:303) 
    org.springframework.web.context.support.SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(SpringBeanAutowiringSupport.java:110) 
    it.jenia.agnese.prova.Presenze.init(Presenze.java:45) 
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503) 
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) 
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421) 
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070) 
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) 
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314) 
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    java.lang.Thread.run(Thread.java:745) 

root cause 

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [it.jenia.ac.mail.rapportini.repository.CollaboratoreRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
    org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:986) 
    org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:856) 
    org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:768) 
    org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:486) 
    org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) 
    org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.processInjection(AutowiredAnnotationBeanPostProcessor.java:303) 
    org.springframework.web.context.support.SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(SpringBeanAutowiringSupport.java:110) 
    it.jenia.agnese.prova.Presenze.init(Presenze.java:45) 
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503) 
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) 
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421) 
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070) 
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) 
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314) 
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    java.lang.Thread.run(Thread.java:745) 

그러나, 요약, 문제는 서블릿 클래스의 REPO를 autowire하기 위해 콩을 찾을 수 있다는 것입니다.

나는 일종의 내 "초보자"자원을 완료하므로, 어떠한 도움이 많이 ..

PS를 감상 할 수있다. o 망 구성 webapp을 가지고 있다는 것을 잊었습니다. 디렉토리 구조는 다음과 같습니다.

src 
---main 
------java 
----------it.jenia.agnese.prova 
---------------Presenze.java 
------resources 
------webapp 
----------META-INF 
--------------test-prova-spring-configuration.xml 
--------------MANIFEST.MF 
----------WEB-INF 
--------------web.xml 
--------------spring 
------------------app-config.xml 
----------Presenze 
--------------presenze.jsp 
+0

스택 인쇄의 "정규화 된 Bean 없음"은 일반적으로 Spring Bean 구성의 긴 줄 문제의 마지막 부분입니다. 모든 것을 보여줄 수 있습니까? – BillFromHawaii

+0

수정 완료되었지만 문제가 너무 해결되었습니다. – softwareplay

답변

0

문제가 구성 파일에 있습니다. 나는 주변의 META-IN 디렉토리를 이동하는 시도 있지만 성공하지, 그럼 내가이 줄을 변경 :

<import resource="classpath*:/test-prova-spring-configuration.xml" /> 

에 :

<import resource="classpath*:/META-INF/test-prova-spring-configuration.xml" /> 

을 갑자기 서버 Tomcat이 나에게 몇 가지 누락 된 클래스 주위에 약간의 출력을 준 구성 (그들은 이전에 테스트 범위를 위해 구성을 사용하고 있었기 때문에 필자의 maven pom.xml에 포함되었지만 테스트로 태그되었습니다). pom.xml에서 테스트 범위를 벗어날 때마다 모든 클래스가 올바르게 작동했다. 방금 maven 프로젝트를 업데이트하고 작동하도록 tomcat 프로젝트를 정리해야했습니다. 그래서 "classpath"가 인식되지 않는 문제였습니다.이상한 점은 Tomcat은 xml이 발견되지 않았다는 결과를주지 않았다는 것입니다. 이를 수정하기 위해 구성 로딩 프로세스를 기록하는 방법이 있어야합니다. 나는이 질문의 대답에서 영감을 얻었다. Printing path of spring.xml in classpath.