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); 
    }
}

编辑 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" />

编辑 3. 我接受了 Sotiros 的回答,即使有些人也是对的。感谢您的所有帮助,我真的很感激!

编辑 4. 我仍在努力如何从 jsp cewolf 标签库中使用 Spring。任何指针如何做到这一点?

编辑 5. 我终于让它工作了。我按照 Sotiros 的回答“......通过 @Controller 中的 @Inject 点并将其添加到模型中。”

4

3 回答 3

2

这个元素

<jsp:useBean id="dataXY" class="ptra.freecharts.DataProviderXY" />

与Spring完全无关。Servlet 容器(jsp 标记库)正在创建DataProviderXY该类的一个实例并使用它。如果 Spring 没有机会处理它,它就无法注入任何东西。

如果您使用的是 Spring MVC,请让上下文DataProviderXY直接或通过 a中的一个@Inject点为您提供 a@Controller并将其添加到Model.

于 2013-11-15T15:02:38.110 回答
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 回答