2

Spring は初めてですが、プロジェクトのニーズに合わせて急いでいます。Spring を Java アプリケーションとして使用する場合、Spring のほとんどの機能を正常に使用できましたが、Web アプリケーションでは望ましい結果が得られません。

applicationContext.xml でデータソースを初期化しようとしています:

<context:annotation-config />
<context:component-scan base-package="learn.spring.webapp.dao" />

<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.postgresql.Driver" />
    <property name="url" value="jdbc:postgresql://localhost:5432/postgres" />
    <property name="username" value="postgres" />
    <property name="password" value="postgres" />
</bean>

<bean id="template" class="org.springframework.jdbc.core.JdbcTemplate"
    autowire="constructor" />

web.xml:

 <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>WEB-INF/spring/applicationContext.xml</param-value>
  </context-param>

  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

アプリケーションで Spring を正常に初期化できましたが、dao クラスで jdbctemplate を自動配線できませんでした。

package learn.spring.webapp.dao;

import learn.spring.webapp.model.Manga;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

@Component
public class MangaDao {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    public void insert(Manga manga){
        String sql = "insert into manga_list values (?,?)";
        jdbcTemplate.update(sql,
                new Object[]{manga.getName(), manga.getAuthor()}); //Null Pointer exception
    }
}

dao パッケージでtemplateBeanを自動配線したい。JdbcTemplateNullPointerException使用しようとすると、 が表示されますJdbcTemplateMangaDaoサーブレットから呼び出されています。自動配線された注釈を正しく使用していない可能性があると思います。ご意見をお聞かせください。

編集:

DAO を呼び出すサーブレット コードは次のとおりです。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        MangaDao md=new MangaDao();
        Manga manga=new Manga();
        manga.setName("Bleach");
        manga.setAuthor("Kubo Tite");
        md.insert(manga);
    }

また、stackTrace は次のとおりです。

SEVERE: Servlet.service() for servlet TesterServlet threw exception
java.lang.NullPointerException
        at learn.spring.webapp.dao.MangaDao.insert(MangaDao.java:16)
        at learn.spring.webapp.controller.TesterServlet.doGet(TesterServlet.java:33)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
        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:298)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
        at java.lang.Thread.run(Thread.java:662)
4

4 に答える 4

4

サーブレットのコードは次のようになっていると思います。

Manga manga = new Manga();
manga.setName(request.getParameter("name"));
manga.setAuthor(request.getParameter("author"));
MangaDao dao = new MangaDao();
dao.insert(manga); // here you get exception;

ただし、自動配線は、Bean からコンテキストを取得した場合にのみ機能します。

MangaDao dao = appContext.getBean(MangaDao.class);
dao.insert(manga); // should be ok;

したがって、appContext を取得できる場所です。フルレで使用するために、ファイルとストアからロードする必要があります。ContextLoaderListener は、このジョブの一部を実行します。次に、それを静的変数に格納するだけです。次に例を示します。

@Component
public class AppContext implements ApplicationContextAware {
    private static MangaDao mangaDao = null;
    public static MangaDao getMangaDao() {
        if(mangaDao == null){
            throw new ApplicationContextException("context not initialized");
        }
        return mangaDao;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        mangaDao = applicationContext.getBean(MangaDao.class);
    }
}

AppContextで定義されたパッケージにクラスが含まれていることを確認context:component-scanlearn.spring.webapp.daoてください。

そして、トランザクションを使用することを強くお勧めします。

于 2012-12-18T15:01:41.367 に答える
2

更新された投稿に回答するには:

新しいインスタンスを作成するのではなく、コンテキストで作成した Bean を使用する必要があります。コントローラーで新しいコンポーネントを作成するのではなく、新しいコンポーネントを自動配線してから使用してみてください。

@Autowired MangaDao mangaDao;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    Manga manga=new Manga();
    manga.setName("Bleach");
    manga.setAuthor("Kubo Tite");
    mangaDao.insert(manga);
}

元の投稿への回答:

コンポーネント スキャンで適切なパッケージ名が欠落しているようです。@Component アノテーションが付けられたクラスは Learn.spring.webapp.model パッケージにあり、スキャンが到達していません。注釈スキャンでより一般的なパッケージを使用してみてください。

<context:component-scan base-package="learn.spring.webapp" />
于 2012-12-18T14:14:04.103 に答える
0

spring-mvc生のサーブレットではなく、使用することをお勧めします。

サーブレットの代わりにspring-mvcコントローラーを定義します。コードに基づいて、Spring Controller は次のようになります。

@Controller 
public class MangaController {

    @Autowired
    private MangaDao dao;

    @RequestMapping(value = "/manga/insert", method = RequestMethod.GET)
    public void doGet() {
        Manga manga = new Manga();
        manga.setName("Bleach");
        manga.setAuthor("Kubo Tite");
        dao.insert(manga);
    }
}

コントローラーは Spring によって管理されるため、必要なすべての依存関係が注入され、コードで使用できるようになりますNullPointerException。.

applicationContext.xmlで、コンポーネント スキャンにコントローラー パッケージを含め、mvc 機能も有効にする必要があります。

<mvc:annotation-driven />

を始めるにあたって、この記事を読むことを強くお勧めしspring-mvcます。必要なすべてのステップと、必要な Spring 依存関係をカバーしています。

また、 Spring Reference documentationに目を通すことをお勧めします。ご覧のとおり、非常に包括的です。

于 2012-12-19T13:28:25.597 に答える