0

@Autowiredアノテーションを使用してSpringフレームワークを使用してServiceクラスを取得しようとしています。

ここで、サービスを使用する必要がある私のクラス(このクラスはWebSocketServletによって呼び出されます)(呼び出し時にNullPointerExceptionが発生します):

public class SignupWebSocketConnection extends MessageInbound {

    private static final Logger log = LoggerFactory.getLogger(SignupWebSocketConnection.class);

    @Autowired
    private UserService userService;

    @Override
    protected void onOpen(WsOutbound outbound) {
        log.info("Connection done");
    }

    @Override
    protected void onClose(int status) {
        log.info("Connection close");
    }

    @Override
    protected void onBinaryMessage(ByteBuffer byteBuffer) throws IOException {
        log.warn("Binary message are not supported");
        throw new UnsupportedOperationException("Binary message are not supported");
    }

    @Override
    protected void onTextMessage(CharBuffer charBuffer) throws IOException {

        User userTest = new User("log", "pass", "ema");
        userService.create(userTest);

    }
}

ここに私のweb.xml:

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext*.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

ここに私のApplicationContext.xml:

<bean id="userService" class="service.UserService">

ApplicationContext-test.xmlを明示的に呼び出してテストパッケージ(mavenを使用)でサービスを使用しようとすると、正常に機能しています... ApplicationContext.xmlとApplicationContext-test.xmlは同じです(データベースへのパラメーターのみ)変更)

みなさん、どうもありがとうございました:D

編集 :

applicationContext.xmlをressourcesフォルダーに置き、テストするクラスを作成します。

   public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = (UserService) ctx.getBean("userService");
        User user = new User("log","pas","emai");
        userService.create(user);
    }

userService.create()を呼び出すときにもNullPointerExceptionが発生します...。

4

1 に答える 1

2

アスペクト/コードウィービングを使用しない場合、Springはでオブジェクトを作成していることを認識しないため、SpringsのApplicationContextからBeanを取得する必要があります(オブジェクトがSpringによってすでに作成されている場合は、すべての@Autowiredフィールドが設定されます)new。Springを使用してWebアプリケーションを作成する通常の方法は、サーブレットではなくDispatcherServletとControllersを使用することです。簡単なチュートリアルについては、たとえばここを参照してください。この背後にある理由は、Springがすべての@ Controller / @ Service / etc注釈付きクラスの作成を処理し、マークされたフィールドを大騒ぎせずに自動配線し、コントローラーメソッドを修正するための要求の委任を処理することなどです。

ただし、サーブレットでアプリケーションコンテキストとBeanをフェッチすることも可能ですが、コードはそれほどクリーンではなく、テストも簡単ではなく、長期的に維持するのはおそらく悪夢になります。例えば:

   WebApplicationContext springContext = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
   MyBeanFromSpring myBean =(MyBeanFromSpring)springContext.getBean("myBeanFromSpring");
   //Do whatever with myBean...
于 2012-08-05T10:10:13.117 に答える