1

私はSpringが初めてで、これは私を混乱させています。DAO 実装を注入しようとすると、コントローラー クラスで動作しますが、まったく同じコードを使用すると、別のクラスで NullPointerException が発生します。

@Inject
private ResultCsvDAO res;
.
.
List<ResultRow> list = res.readResultToObjects();

最後の行は NullPointerExceprion を示します。Spring構成ファイルですべてのパッケージを使用しました。

<context:component-scan base-package="ptra.freecharts, ptra.controller, ptra.dao" />
<context:annotation-config />

私が見逃していることや間違っていることはありますか?

編集。これはフルクラスです

package ptra.freecharts;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.inject.Inject;

import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import ptra.dao.ResultCsvDAO;
import ptra.model.ResultRow;
import de.laures.cewolf.DatasetProduceException;
import de.laures.cewolf.DatasetProducer;

@Service
public class DataProviderXY implements DatasetProducer, Serializable {
    private static final long serialVersionUID = 4755020363939818521L;

    private final Logger logger = LoggerFactory.getLogger(DataProviderXY.class);

    @Inject
    private ResultCsvDAO res;   

    public String getProducerId() {
        return "ptra.freecharts.XY";
    }
    public boolean hasExpired(
        Map arg0, Date arg1) {
        return false;
    }
    public Object produceDataset(Map arg0) throws DatasetProduceException {
        XYSeries dataset = new XYSeries("XY Dataset");      
        List<ResultRow> list = res.readResultToObjects();       
        for (int i=0; i<list.size(); i++) {
            dataset.add(i, list.get(i).getElapsed());
        }
        return new XYSeriesCollection(dataset); 
    }
}

EDIT 2. DataProviderXY は jsp で呼び出されます。

<jsp:useBean id="dataXY" class="ptra.freecharts.DataProviderXY" />
<cewolf:chart id="XYChart" title="Transaction response times" type="xy">
    <cewolf:gradientpaint>
        <cewolf:point x="0" y="0" color="#FFFFFF" />
        <cewolf:point x="300" y="0" color="#DDDDFF" />
    </cewolf:gradientpaint>
    <cewolf:data>
        <cewolf:producer id="dataXY" />
    </cewolf:data>
</cewolf:chart>
<cewolf:img chartid="XYChart" renderer="cewolf" width="640"
    height="500" />

EDIT 3. 私は Sotiros の答えを受け入れました。ご協力いただきありがとうございます。本当に感謝しています。

編集 4. jsp cewolf タグ lib から Spring を使用する方法にまだ苦労しています。それを行う方法はありますか?

EDIT 5.私はついにそれを機能させました。Sotiros の回答に従いました。「... @Controller の @Inject ポイントを使用して、モデルに追加します。」

4

3 に答える 3

0

制御の反転と依存性注入は、Spring のコア機能です。チェーン内のすべての Bean が Spring によって管理されている場合にのみ、依存する Bean の自動注入とインスタンス化が保証されます。

特定の問題に答えるために、注入しているクラスはResultCsvDAO res;Springによって正確に管理されていません。

Spring によって管理されるとは、Spring によってインスタンス化され、Spring がこのクラスに関する情報を持っている必要があることを意味します。

それでも問題が解決しない場合は、クラス全体を貼り付けていただければ、問題を解決できると思います。

于 2013-11-15T14:39:59.003 に答える
0

あなたの@Inject注釈はどのパッケージからのものですか?

Spring は通常@Autowired、Spring Framework API の一部である を使用します。また@javax.annotation.Resource、Spring Framework によって処理されます。

@javax.inject.Injectは Spring 3 でのみサポートされています。どのバージョンの Spring を使用していますか?

Spring 3 を使用している場合はResultCsvDAO、Spring コンテナー内で型の Bean を定義する必要があります。これは、XML Spring 構成ファイルまたは注釈を使用して実行できます@Component

また、注入しようとしているこの Bean は、Spring 管理の Bean ですか?

于 2013-11-15T14:35:06.510 に答える