NulllPointerException при доступе к базе данных с помощью JdbcTemplate в Spring - PullRequest
1 голос
/ 19 ноября 2011

Я новичок в Spring, я следую некоторым примерам из книг и учебных пособий на веб-сайте Spring, и я не могу заставить свой код работать.

Я пытаюсь получить доступ к базе данных, используя JdbcTemplate.Вот как выглядит мой root-context.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/db" />
    <property name="username" value="userr" />
    <property name="password" value="password" />
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">
    <constructor-arg ref="dataSource"/>
</bean>
<bean id="myDao" class="com.me.myproj.persistence.JdbcMyaDao">
    <property name="dataSource" ref="dataSource"/>
</bean>

Это мой JdbcMyDao (все операции импорта выполнены, я не буду их вставлять):

public class JdbcMyDao implements MyDao{

private JdbcTemplate jdbcTemplate;

public void setDataSource(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
 }

public String getOpcionById(){
    String SQL_Q="select name from options where id=35";

    return (String)this.jdbcTemplate.queryForObject(SQL_Q, String.class);
}

}

Наконец, мой контроллер:

@Controller
public class myController {

    @RequestMapping(value = "/show", method = RequestMethod.GET)
    public String show(Model model){

        JdbcMyDao daoP=new JdbcMyDao();
        String op=daoP.getOpcionById();

        model.addAttribute("op",op);
        return "show";
    }
}

Хорошо, тогда show.jsp просто печатает возвращаемую строку.

Итак, это оченьпростой доступ к базе данных, но я получаю исключение nullPointerException при использовании JdbcTemplate (в функции getOpcionById)

Я думаю, это потому, что функция setDataSource никогда не запускается, я думал, что Spring запускает ее с помощью IoC,Я пытался поместить @Autowired в свойство jdbcTemplate i JdbcMyDao, но это тоже не сработало.Может кто-нибудь сказать мне, что делает Spring и какие шаги мне делать?Или какие изменения я должен сделать и почему?

Ответы [ 2 ]

3 голосов
/ 19 ноября 2011

Вам нужно автоматически связать DAO в вашем контроллере, а не создавать его экземпляр:

@Autowired
private JdbcMyDao dao;

Когда вы создаете его с помощью new JdbcMyDao(), он не управляется пружиной, и его зависимости не вводятся.

Это, на мой взгляд, самая распространенная ошибка начинающих с внедрением зависимостей.Проверьте этот пост и посмотрите, прояснит ли он вас.

2 голосов
/ 19 ноября 2011

Ваш контроллер создает свой собственный JdbcMyDao и вызывает его, а не использует компонент, который вы объявили в root-context.xml. Вам нужно добавить боб myDao в ваш контроллер и вызвать его.

Кроме того, есть ли причина, по которой вы определяете боб JdbcTemplate, а затем ничего не делаете с ним? setDataSource метод DAO создает свой собственный JdbcTemplate (что нормально), поэтому нет никаких причин объявлять bean-компонент.

У меня такое ощущение, что вы не совсем поняли концепцию внедрения зависимостей - вы, кажется, использовали прямую реализацию и объявленных bean-компонентов, а не только последнюю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...