2015-06-22 83 views
1

我有兩個服務類和一個存儲庫類。當我嘗試將一個服務bean自動裝入另一個服務bean時,一個bean被注入。但是當我嘗試調用該方法時,它顯示NullPointerException。請幫助我。過去三天我一直堅持這一點。@autowiring未注入

我的第一個服務類:

@Service 
public class MetaData implements MetaDataService { 


    private AffiliateRepository util; 

    @Autowired 
    public MetaData(AffiliateRepository util) { 
     this.util = util;// I can see bean getting injected 
    } 

    public boolean findByEmail() { 

     // some logic 
    } 

} 

我的第二個服務類:

@Service 
public class ResetPasswordForm implements ResetPasswordFormService { 

    public ResetPasswordForm() { 

    } 

      private MetaDataService md; 

    @Autowired 
    public ResetPasswordForm(MetaDataService md) { 
     this.md = md; // when iam debugging I could see bean got injected at this point. 
    } 

    public void advancedValidation(Map<String, String> errors) { 

     else if (id.contains("@") && md.findByEmail())// when iam calling method present in class using md it is showing md is null { 
           } 
    } 
} 

我的倉庫類:

@Repository 
public class JpaAffiliate implements AffiliateRepository, Serializable { 
    private EntityManagerFactory emf; 

    @PersistenceUnit(unitName="resetpwd-unit") 
    public void setEntityManagerFactory(EntityManagerFactory emf) { 
     this.emf = emf; 
    } 

    @SuppressWarnings("unchecked") 
    public List<Affiliate> findAffiliate(String value) { 
     // calls to database 
    } 
} 

我已經嘗試了一切(例如指向我的基礎包的<context:component-scan base-package>)。可能是什麼問題呢?

下面

是我的全堆棧跟蹤

ResetPasswordForm.java:134) [classes:] 
    at (ResetPasswordForm.java:119) [classes:] 
    at ...resetpwd.web.Page.getPage(Page.java:38) [classes:] 
    at ....web.ResetPasswordController.addContact(ResetPasswordController.java:52) [classes:] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_55] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [rt.jar:1.7.0_55] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.7.0_55] 
    at java.lang.reflect.Method.invoke(Method.java:606) [rt.jar:1.7.0_55] 
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219) [spring-web-3.2.6.RELEASE.jar:3.2.6.RELEASE] 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) [spring-web-3.2.6.RELEASE.jar:3.2.6.RELEASE] 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) [spring-webmvc-3.2.6.RELEASE.jar:3.2.6.RELEASE] 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745) [spring-webmvc-3.2.6.RELEASE.jar:3.2.6.RELEASE] 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686) [spring-webmvc-3.2.6.RELEASE.jar:3.2.6.RELEASE] 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) [spring-webmvc-3.2.6.RELEASE.jar:3.2.6.RELEASE] 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925) [spring-webmvc-3.2.6.RELEASE.jar:3.2.6.RELEASE] 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) [spring-webmvc-3.2.6.RELEASE.jar:3.2.6.RELEASE] 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936) [spring-webmvc-3.2.6.RELEASE.jar:3.2.6.RELEASE] 
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838) [spring-webmvc-3.2.6.RELEASE.jar:3.2.6.RELEASE] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:754) [jboss-servlet-api_3.0_spec-1.0.2.Final-redhat-1.jar:1.0.2.Final-redhat-1] 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812) [spring-webmvc-3.2.6.RELEASE.jar:3.2.6.RELEASE] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [jboss-servlet-api_3.0_spec-1.0.2.Final-redhat-1.jar:1.0.2.Final-redhat-1] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:295) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101) [spring-web-3.2.6.RELEASE.jar:3.2.6.RELEASE] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:246) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] 
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) [spring-web-3.2.6.RELEASE.jar:3.2.6.RELEASE] 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-3.2.6.RELEASE.jar:3.2.6.RELEASE] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:246) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] 
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) [spring-web-3.2.6.RELEASE.jar:3.2.6.RELEASE] 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-3.2.6.RELEASE.jar:3.2.6.RELEASE] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:246) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:149) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] 
    at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50) [jboss-as-jpa-7.3.0.Final-redhat-14.jar:7.3.0.Final-redhat-14] 
    at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50) [jboss-as-jpa-7.3.0.Final-redhat-14.jar:7.3.0.Final-redhat-14] 
    at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:169) [jboss-as-web-7.3.0.Final-redhat-14.jar:7.3.0.Final-redhat-14] 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:145) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:97) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:102) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:336) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] 
    at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:488) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] 
    at org.apache.coyote.ajp.AjpProtocol$AjpConnectionHandler.process(AjpProtocol.java:420) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:920) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] 
    at java.lang.Thread.run(Thread.java:745) [rt.jar:1.7.0_55] 

http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd」版本= 「3.0」>

我web.xml文件

<description>resetpwd Web Application</description> 
    <display-name>resetpwd</display-name> 


    <filter> 
    <filter-name>hiddenHttpMethodFilter</filter-name> 
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> 
    </filter> 

    <filter-mapping> 
    <filter-name>hiddenHttpMethodFilter</filter-name> 
    <servlet-name>resetpwd</servlet-name> 
    <url-pattern>/*</url-pattern> 
    </filter-mapping> 


    <servlet> 
     <servlet-name>resetpwd</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>classpath*:spring/servlet-context.xml</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>resetpwd</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 
    <filter> 
     <filter-name>encodingFilter</filter-name> 
     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
     <init-param> 
      <param-name>encoding</param-name> 
      <param-value>UTF-8</param-value> 
     </init-param> 
     <init-param> 
      <param-name>forceEncoding</param-name> 
      <param-value>true</param-value> 
     </init-param> 
    </filter> 

    <filter-mapping> 
     <filter-name>encodingFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

    <!-- uncomment JPA support persistence unit configuration below --> 

    <persistence-unit-ref> 
     <persistence-unit-ref-name>persistence/resetpwd-unit</persistence-unit-ref-name> 
     <persistence-unit-name>resetpwd-unit</persistence-unit-name> 
    </persistence-unit-ref> 

    <persistence-context-ref> 
    <persistence-context-ref-name>persistence/resetpwd-context</persistence-context-ref-name> 
    <persistence-unit-name>resetpwd-unit</persistence-unit-name> 
    </persistence-context-ref> 


    <!-- uncomment JPA support persistence unit configuration above --> 

    <welcome-file-list> 
     <welcome-file>welcome.jsp</welcome-file> 
     <welcome-file>welcome.html</welcome-file> 
     <welcome-file>index.html</welcome-file> 
     <welcome-file>index.jsp</welcome-file> 
    </welcome-file-list> 

</web-app> 

這裏的servlet-context.xml的

<?xml version="1.0" encoding="UTF-8"?> 
<!-- 
    DispatcherServlet context for applications web tier 
--> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:p="http://www.springframework.org/schema/p" 
     xmlns:security="http://www.springframework.org/schema/security" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:mvc="http://www.springframework.org/schema/mvc" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xmlns:jee="http://www.springframework.org/schema/jee" 
     xsi:schemaLocation="http://www.springframework.org/schema/mvc 
      http://www.springframework.org/schema/mvc/spring-mvc.xsd 
      http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans.xsd 
      http://www.springframework.org/schema/security 
      http://www.springframework.org/schema/security/spring-security.xsd 
      http://www.springframework.org/schema/tx 
     http://www.springframework.org/schema/tx/spring-tx.xsd 
     http://www.springframework.org/schema/jee 
     http://www.springframework.org/schema/jee/spring-jee.xsd      
      http://www.springframework.org/schema/context 
      http://www.springframework.org/schema/context/spring-context.xsd"> 

    <security:debug/> 

    <import resource="servlet-view.xml"/> 



    <context:component-scan base-package="edu.ucsd.act.core.resetpwd" /> 



    <!-- turns on support for mapping requests to Spring MVC @Controller methods. also registers default Formatters and validators for use across all @Controllers --> 
    <mvc:annotation-driven conversion-service="conversionService"/> 

    <!-- all resources (css,js,jpg,png,bmp) inside folder (src/main/webapp/resources) are mapped so they can be referred to inside JSP files (see header.jsp for more details) --> 
    <mvc:resources mapping="/resources/**" location="/resources/"/>  



    <bean id="expressionHandler" class="edu.ucsd.act.core.coresecurity.requiresaction.MethodExpressionHandler" /> 


    <!-- static case, no java controller needed --> 
    <mvc:view-controller path="/" view-name="welcome" /> 

    <!-- serve all static resources (*.html,...) from src/main/webapp/ -->  
    <mvc:default-servlet-handler/> 

    <!-- [J] customized --> 
    <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> 

     <!-- [1] remove default formatters --> 
     <property name="registerDefaultFormatters" value="false" /> 

     <!-- [2] establish exact formatters that are desired --> 
     <property name="formatters"> 
      <set> 
       <bean class="org.springframework.format.number.NumberFormatAnnotationFormatterFactory" /> 
       <!-- add additional business formatters here --> 
      </set> 
     </property> 

     <!-- [3] alter formatter to match your business requirement --> 
     <property name="formatterRegistrars"> 
      <set> 
       <bean class="org.springframework.format.datetime.joda.JodaTimeFormatterRegistrar"> 
        <property name="dateFormatter"> 
         <bean class="org.springframework.format.datetime.joda.DateTimeFormatterFactoryBean"> 
          <property name="pattern" value="yyyyMMdd"/> 
         </bean> 
        </property> 
       </bean> 
      </set> 
     </property> 
    </bean> 

    <!-- 
     - Message source for this context, loaded from localized "messages_xx" files. 
     - Files are stored inside src/main/resources 
    --> 
    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource" p:basename="messages/messages" p:fallbackToSystemLocale="false"/> 

    <!-- [J] register "global" interceptor beans to apply to all registered HandlerMappings --> 
    <mvc:interceptors> 
     <bean class="org.springframework.web.servlet.theme.ThemeChangeInterceptor"/> 
     <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" p:paramName="lang"/> 
    </mvc:interceptors> 

    <!-- [J] store preferred language configuration in a cookie --> 
    <bean class="org.springframework.web.servlet.i18n.CookieLocaleResolver" id="localeResolver" p:cookieName="locale"/> 

    <!-- [J] resolves localized <theme_name>.properties files in the classpath to allow for theme support, store configuration in a cookie 
    <bean class="org.springframework.ui.context.support.ResourceBundleThemeSource" id="themeSource"/> 
    <bean class="org.springframework.web.servlet.theme.CookieThemeResolver" id="themeResolver" p:cookieName="theme" p:defaultThemeName="standard"/> 
    --> 

    <!-- This bean resolves specific types of exceptions to corresponding logical - view names for error views. The default behavior of 
     DispatcherServlet - is to propagate all exceptions to the servlet container: this will happen - here with all other types of exceptions. --> 
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> 

     <!-- view name resolved using bean of type InternalResourceViewResolver (declared in servlet-view.xml) --> 
     <property name="defaultErrorView" value="exception"/> 

     <!-- results into 'WEB-INF/views/exception.jsp' --> 
     <property name="warnLogCategory" value="warn"/> 

     <property name="exceptionMappings"> 
      <props> 
       <!-- spring security --> 
       <prop key="org.springframework.security.access.AccessDeniedException">/403</prop> 
      </props> 
     </property> 
    </bean> 

    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver"> 
     <property name="order" value="1"/> 
    </bean> 
    <bean class="org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver" > 
     <property name="order" value="2"/> 
    </bean> 

    <!-- developer may wish to further customize final exception handler --> 
    <bean class="edu.ucsd.act.core.resetpwd.util.AppHandlerExceptionResolver"> 
     <property name="order" value="3"/> 
    </bean> 

    <!-- Enable this for eventual integration of file upload functionality 
    <bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver" id="multipartResolver" /> 
    --> 

    <tx:annotation-driven mode="aspectj" 
     transaction-manager="transactionManager" /> 

    <bean id="app" class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/> 
<jee:jndi-lookup id="resetpwd-unit" jndi-name="persistence/resetpwd-unit" /> 

</beans> 


public Map<String, String> validate() throws IOException { 

advancedValidation(errors); 

} 


public void advancedValidation(Map<String, String> errors) { 



     if (!id.contains("@") && md.findByRacf()) { 
      // found a unique affiliate based on racf (may be primary or 
      // secondary) 
     } else if (id.contains("@") && md.findByEmail()) { 
      // found a unique affiliate based on email 
     } else { 
      // a unique affiliate record could not be located 
      errors.put("id", "resetpw.nouiserinfo"); 
      return; 
     } 
+3

發佈真實代碼,發佈完整的異常堆棧跟蹤。 –

+3

使用現場注入或構造函數注入。沒有必要這樣做。 –

+2

你在哪裏調用advancedValidation? –

回答

0

我的腦海裏只有一種可能的解釋:你有多個上下文加載,而且你實際上有兩個不同的NPE類的bean實例 - 一個帶有注入依賴關係,另一個沒有它(導致NPE)。

由於您使用Spring mvc,因此有關可能原因的更多信息,您可以查看here,herehere

+0

嗨,我已經添加了我的web.xml和servlet-context.xml文件,請你看看,因爲我不認爲我創建了多個上下文。 – Myrna

+0

@Myrna你可以發表你調用'advancedValidation'的代碼嗎? –

+0

嗨,感謝您的回覆 – Myrna

0

試試這個。這種模式的工作原理,只要你是一致的:

@Service 
public class MetaData implements MetaDataService { 

    public boolean findByEmail() { 
     this.affiliateRepository.someMethod(); 
     // some logic 
    } 

    //I like to autowire at the bottom - keep all the glamour up front 
    @Autowired 
    private AffiliateRepository affiliateRepository; 
} 

您的其他服務:

@Service 
public class ResetPasswordForm implements ResetPasswordFormService { 

    public ResetPasswordForm() {} 

    public void advancedValidation(Map<String, String> errors) { 

     if (someJunk) { 
     } 
     else if (id.contains("@") && metaData.findByEmail()) { 
     } 
     else { 
     } 
    } 

    //your ORM, if you have one, may complain if this is an interface 
    @Autowired 
    private MetaData metaData; 
} 

我通常不使用EntityManager(我用SessionFactory),但我想這將是是這樣的:

@Repository 
@Transactional 
public class AffiliateRepositoryImpl implements AffiliateRepository, Serializable { 

    @PersistenceContext 
    private EntityManager entityManager; 

    @SuppressWarnings("unchecked") 
    @Transactional(readOnly = true, timeout = 10) 
    public List<Affiliate> findAffiliate(String value) { 
    // calls to database 
    } 
} 

您應檢查persistence.xml,以確保它與持久性單元defined正確。

1

您已在ResetPasswordForm類中聲明瞭兩個構造函數。很可能,Spring容器可能爲同一個類with parameter創建了一個重複實例,其他實例也創建了一個default constructor。嘗試刪除默認的構造函數創建。它應該工作。