-1

在下面提到的代碼中,我創建了這個,因爲我得到java.lang.NullPointerException,看到我的錯誤日誌下。當我實施這個時,它已經修復並且完美運行。然而,這裏有一位成員告訴我 -SpringMvc實例化Bean - Singleton

「您正在爲每次調用getOfficerRegistrationValidation創建新的bean,這包括重新創建數據庫對象,這些對象每個都很昂貴,並且如果某些對象應該是你應該找到一種方法讓軍官註冊認證可重複使用和線程安全,這樣你就可以只擁有一個,並且只使用IoC注入到任何你想要的地方「

我認爲他是對的可以有人告訴我最好的方式做到這一點,而不必再次實例化所有的bean。我只想實例化只有特定的bean,而不會遇到這個問題。

public final class BeanFactory() { 

    private static ClassPathXmlApplicationContext context; 

    private static ClassPathXmlApplicationContext getContext() { 
     if (context== null) { 
      context = new ClassPathXmlApplicationContext("applicationContext.xml"); 
     } 
     return context; 
    } 

    public static OfficerRegistrationValidation getOfficerRegistrationValidation() { 
     return (OfficerRegistrationValidation) getContext().getBean("officerRegistrationValidation"); 
    } 
} 

在控制器作出這樣一個電話:`BeanFactory.getOfficerRegistrationValidation()驗證(....)

錯誤日誌:

java.lang.NullPointerException 
    at com.crimetrack.service.OfficerRegistrationValidation.validate(OfficerRegistrationValidation.java:51) 
    at org.springframework.validation.DataBinder.validate(DataBinder.java:725) 
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doBind(HandlerMethodInvoker.java:815) 
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:367) 
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:171) 
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436) 
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) 
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
    at java.lang.Thread.run(Unknown Source) 

回答

1

我要去冒險猜測你在問什麼(因爲你的問題並沒有提供你使用beanfactory的動機,也沒有提供足夠的代碼來給出完整的圖片)...

Spring bean默認實例化爲單例。因此,您應該能夠配置Spring使用XML或註釋(@Component)創建您的OfficerRegistrationValidation對象,然後通過使用@Inject註釋將其注入到控制器中。

註解是要走的路 - 只是確保你已經在你的Spring XML配置如下(applicationContext.xml):

<context:component-scan base-package="com.acme.project" /> 
<mvc:annotation-driven /> 

然後只需將@Component註釋添加到您的OfficerRegistrationValidation類的類聲明:

@Component 
public class OfficerRegistrationValidation { 

,然後在你的控制器,聲明現場爲您OfficerRegistrationValidation,從而將其標註爲:

@Controller 
pubic class MyController { 
    @Inject 
    private OfficerRegistrationValidation officerRegistrationValidation; 

現在您將可以訪問控制器中的OfficerRegistrationValidation singleton bean - 只需要4行代碼!

+0

我已經使用JSR330'@ Inject'註解,Spring可以使用這個或更常見的'@ Autowired'註解來做同樣的事情。你的選擇。 – nickdos

+0

我使用的是基於xml的配置,因爲我沒有完全理解註釋,所以現在我使用的註釋類似混合配置。使用xml配置有助於我理解整個項目的佈線。我仍然沒有得到Autowired註解這就是爲什麼我使用混合動力我主要使用Controller,RequestMapping等。你能給我一些建議嗎? – devdar

+0

這是我在此論壇上的上一個問題,涉及到我詢問的相同問題,它包含所有代碼和解釋http://stackoverflow.com/questions/12558476/springmvc-java-lang-nullpointerexception-when-posting- form-to-server/12589627#comment16968815_12589627 – devdar