-1

以下のコードでは、java.lang.NullPointerException を取得していたため、これを作成しました。下のエラー ログを参照してください。これを実装すると修正され、完全に機能しました。しかし、私はここのメンバーの一人から言われました -

「getOfficerRegistrationValidationへの呼び出しごとに新しいBeanを作成しています。これには、データベースオブジェクトの再作成が含まれます。これには、すべてのコストがかかり、一部のオブジェクトが1回だけ作成されるとエラーが発生する可能性があります(シングルトン)。OfficerRegistrationValidationを再利用可能にする方法を見つける必要があります。スレッドセーフであるため、そのうちの 1 つだけを使用して、IC のみを使用して必要な場所にこれを挿入できます」

そして、すべての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().validate(....)

エラーログ:

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)
4

1 に答える 1

1

私はあなたが何について質問しているのか推測するのを危険にさらすつもりです(あなたの質問はビーンファクトリーを使用する動機を提供せず、全体像を与えるのに十分なコードを提供しないため)...

Spring Beanは、デフォルトでシングルトンとしてインスタンス化されます。OfficerRegistrationValidationしたがって、XMLまたはアノテーション(@Component)を使用してオブジェクトを作成し、アノテーションを使用してオブジェクトをコントローラーに挿入するようにSpringを構成できるはずです@Inject

アノテーションは進むべき道です-SpringconfigXML(applicationContext.xml)に次のものがあることを確認してください。

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

@Component次に、クラスのクラス宣言にアノテーションを追加するだけですOfficerRegistrationValidation

@Component
public class OfficerRegistrationValidation {
    // ...
}

次に、コントローラーで、OfficerRegistrationValidationのフィールドを宣言し、次のように注釈を付けます。

@Controller
public class MyController {
    @Inject
    private OfficerRegistrationValidation officerRegistrationValidation;
    // ...
}

これで、コントローラー内のシングルトンBeanにアクセスできるようになりOfficerRegistrationValidationます。必要なコードはわずか4行です。

于 2012-09-27T01:20:35.233 に答える