我对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);
}
}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。我接受了索提罗斯的回答,即使是强硬的,也有其他人是正确的。谢谢你的帮助,我真的很感激!
编辑4.我仍然在挣扎如何使用jsp cewolf标记库中的Spring。有什么建议怎么做吗?
编辑5,我终于让它起作用了。我遵循Sotiros的回答“在@Controller中插入...through点,并将其添加到模型中。”
发布于 2013-11-15 15:02:38
这个元素
<jsp:useBean id="dataXY" class="ptra.freecharts.DataProviderXY" />与Spring完全无关,Servlet容器(jsp标记库)正在创建DataProviderXY类的实例并使用它。如果春天从来没有机会处理它,它就不能注入任何东西。
如果您正在使用Spring,那么让上下文直接或通过DataProviderXY中的@Inject点向您提供一个@Controller,并将其添加到Model中。
发布于 2013-11-15 14:35:06
您的@Inject注释来自哪个包?
Spring通常使用@Autowired,这是Spring的一部分。@javax.annotation.Resource也是由Spring处理的。
仅在Spring3中支持@javax.inject.Inject。您使用的是哪个版本的Spring?
如果使用Spring 3,则必须在Spring容器中定义一个类型为ResultCsvDAO的bean。这可以在XML配置文件中执行,也可以使用注释(例如@Component )执行。
另外,这个bean是您想要注入的吗,一个Spring管理的bean?
发布于 2013-11-15 14:39:59
控制反转和依赖注入是Spring的核心特性。只有当链中的所有bean都由Spring管理时,它才能保证依赖bean的自动注入和实例化。
为了回答您的具体问题,您要注入ResultCsvDAO res;的类并不是由Spring管理的。
当我说由Spring管理时,这意味着它必须由Spring实例化,Spring必须有关于这个类的信息。
如果这仍然没有帮助您,那么我相信您可以粘贴完整的类,我将能够解决您的问题。
https://stackoverflow.com/questions/20003434
复制相似问题