powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / NPE для dataSource.getConnection()
19 сообщений из 19, страница 1 из 1
NPE для dataSource.getConnection()
    #38197258
buyboy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всем привет

не могу соединиться с базой из контроллера в Spring...

задаю параметры подключения в applicationContext.xml =
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<bean id="propertyConfigurer"
   class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
   p:location="/WEB-INF/jdbc.properties" />

<bean id="dataSource"
   class="org.springframework.jdbc.datasource.DriverManagerDataSource"
   p:driverClassName="${jdbc.driverClassName}"
   p:url="${jdbc.url}"
   p:username="${jdbc.username}"
   p:password="${jdbc.password}" />



в контроллере
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
package ru.spring;

import java.sql.Statement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.DataSource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;

public class MyPageController extends AbstractController {
  
  public MyPageController() {
  }
  
  private DataSource dataSource;

  public void setDataSource(DataSource dataSource) {
      this.dataSource = dataSource;
  }  
  
  protected ModelAndView handleRequestInternal(
          HttpServletRequest request,
          HttpServletResponse response) throws Exception {
    
    ModelAndView model = new ModelAndView("mypage");
    
    // `pages2` = `page`, `title`, `content`
    String sql = "SELECT `title` FROM `pages2` WHERE `page` = 'about'";
    
    Connection conn = null;
    Statement st = null;
    
    String page = "";
    
    try {
        conn = dataSource.getConnection();
        st = conn.createStatement();

        ResultSet res = st.executeQuery(sql);
        while(res.next()) {
          page = res.getString("title");
        }
    } catch (SQLException e) {
        throw new RuntimeException(e);
    } 
        
    model.addObject("db_title", page);

    return model;
  }
  
}


в строке conn = dataSource.getConnection(); получаю java.lang.NullPointerException...

получается что не подгрузились параметры соединения из applicationContext.xml ?
или где-то еще ошибка?

нужен хелп!
...
Рейтинг: 0 / 0
NPE для dataSource.getConnection()
    #38197264
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где XML для инъекции dataSource в MyPageController?
...
Рейтинг: 0 / 0
NPE для dataSource.getConnection()
    #38197280
buyboy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczГде XML для инъекции dataSource в MyPageController?не понял... в контроллере нужен какой-то дополнительный функционал по подключению dataSource из applicationContext.xml ?
...
Рейтинг: 0 / 0
NPE для dataSource.getConnection()
    #38197284
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buyboyне понял... в контроллере нужен какой-то дополнительный функционал по подключению dataSource из applicationContext.xml ?
ОК. Кто и почему, по-вашему, должен вызвать метод setDataSource(...)?
...
Рейтинг: 0 / 0
NPE для dataSource.getConnection()
    #38197336
buyboy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczОК. Кто и почему, по-вашему, должен вызвать метод setDataSource(...)?честно говоря думал - фрэймворк прочитает параметры бина сам...
...
Рейтинг: 0 / 0
NPE для dataSource.getConnection()
    #38197343
buyboy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, спасибо за наводку! получилось при такой схеме =
Код: java
1.
2.
3.
4.
5.
    ApplicationContext ctx = new ClassPathXmlApplicationContext("ru/spring/applicationContext.xml");
    Object obj = ctx.getBean("dataSource");
    DriverManagerDataSource dss = (DriverManagerDataSource) obj;
    ...
    conn = dss.getConnection("login","password");


не получилось прочитать applicationContext.xml из WEB-INF = пришлось переместить в пакидж ru.spring... вот это не сработало
Код: java
1.
ApplicationContext ctx = new ClassPathXmlApplicationContext("/WEB-INF/applicationContext.xml");


и еще: почему надо добавлять логин и пароль = ведь есть же вызов метода и без них ?
...
Рейтинг: 0 / 0
NPE для dataSource.getConnection()
    #38197347
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buyboyчестно говоря думал - фрэймворк прочитает параметры бина сам...
"Сам", значит Auto. Нужная фича называется Autowire. Для управления ей существует соответствующая аннотация.
Существует так же мнение, что если мешать в куча инъекции через аннотации и через XML, то это приведёт к новым багам.
Поэтому, если у вас всё в XML, просто добавьте свойство в XML со ссылкой на dataSource бин.
...
Рейтинг: 0 / 0
NPE для dataSource.getConnection()
    #38197358
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buyboyне получилось прочитать applicationContext.xml из WEB-INF
граждане, ну читайте же уже документацию. ну что за весеннее обострение такое.
...
Рейтинг: 0 / 0
NPE для dataSource.getConnection()
    #38197403
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buyboyне получилось прочитать applicationContext.xml из WEB-INF = пришлось переместить в пакидж ru.spring... вот это не сработало
Код: java
1.
ApplicationContext ctx = new ClassPathXmlApplicationContext("/WEB-INF/applicationContext.xml");



Наверное потому что ни корень веб-приложения, ни WEB-INF, это не classpath. WEB-INF/classes - это classpath.
Если нужно загружать Spring xml из веб-приложения, то нужно либо файлам задавать имена, которые Spring умеет находить. Либо прописывать имена в web.xml.
...
Рейтинг: 0 / 0
NPE для dataSource.getConnection()
    #38197411
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buyboyи еще: почему надо добавлять логин и пароль = ведь есть же вызов метода и без них ?
Нужно выкинуть DriverManagerDataSource вообще. Настроить DataSource 1 раз в Tomcat и использовать его через JNDI

Код: xml
1.
2.
3.
4.
5.
6.
7.
    
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="java:comp/env/jdbc/DataSourceName"/>
        <property name="lookupOnStartup" value="true"/>
        <property name="cache" value="true"/>
        <property name="proxyInterface" value="javax.sql.DataSource"/>
    </bean>
...
Рейтинг: 0 / 0
NPE для dataSource.getConnection()
    #38197429
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczНастроить DataSource 1 раз в Tomcat и использовать его через JNDI

Код: xml
1.
2.
3.
4.
5.
6.
7.
    
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="java:comp/env/jdbc/DataSourceName"/>
        <property name="lookupOnStartup" value="true"/>
        <property name="cache" value="true"/>
        <property name="proxyInterface" value="javax.sql.DataSource"/>
    </bean>



или даже так :)

Код: xml
1.
<jee:jndi-lookup id="dataSource" jndi-name="jdbc/db"/>
...
Рейтинг: 0 / 0
NPE для dataSource.getConnection()
    #38197451
buyboy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczНужно выкинуть DriverManagerDataSource вообще. Настроить DataSource 1 раз в Tomcat
тогда получается, что в context.xml Tomcat мне нужно прописать нечто подобное =
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<Context>

  <Resource name="jdbc/db" 
	    auth="Container" 
	    type="javax.sql.DataSource"
	    maxActive="100" 
	    maxIdle="30" 
	    maxWait="10000"
	    username="login" 
	    password="password" 
	    driverClassName="com.mysql.jdbc.Driver"
	    url="jdbc:mysql://localhost:3306/mydb"/>
			
</Context>


затем в applicationContext.xml прописать бин =
Код: xml
1.
2.
3.
4.
5.
6.
7.
    
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="java:comp/env/jdbc/DataSourceName"/>
        <property name="lookupOnStartup" value="true"/>
        <property name="cache" value="true"/>
        <property name="proxyInterface" value="javax.sql.DataSource"/>
    </bean>


а как тогда получить connection в контроллере?
...
Рейтинг: 0 / 0
NPE для dataSource.getConnection()
    #38197457
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buyboyа как тогда получить connection в контроллере?
Т.е. понимания зачем все эти XML вообще нужны нет и не приходит?

Код: xml
1.
2.
3.
<bean id="myPageController" class="ru.spring.MyPageController">
        <property name="dataSource" ref="dataSource"/>
</bean>
...
Рейтинг: 0 / 0
NPE для dataSource.getConnection()
    #38197591
buyboy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
рабочее решение получилось таким =

в META-INF/ context.xml вписал вот это =
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="">
  <Resource name="jdbc/mydb" 
            auth="Container" 
            type="javax.sql.DataSource"
            maxActive="50" 
            maxIdle="30" 
            maxWait="10000"
            username="login"
            password="password" 
            driverClassName="com.mysql.jdbc.Driver"
            url="jdbc:mysql://localhost:3306/mydatabase"/>  
</Context>


в WEB-INF/ web.xml добавил это =
Код: xml
1.
2.
3.
4.
5.
6.
    <resource-ref>
      <description>MySQL Datasource example</description>
      <res-ref-name>jdbc/mydb</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
    </resource-ref>


контроллер получился такой =
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
package ru.spring;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.DataSource;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;

public class PageController extends AbstractController {
  
  private DataSource ds;
  
  public PageController() { 
        
    try {
      Context ctx = new InitialContext();
      ds = (DataSource)ctx.lookup("java:comp/env/jdbc/mydb");
    } catch (NamingException e) {
      e.printStackTrace();
    }        
    
  }  
  
  protected ModelAndView handleRequestInternal(
          HttpServletRequest request,
          HttpServletResponse response) throws Exception {
    
    ModelAndView model = new ModelAndView("page");
    
    // `pages2` = `page`, `title`, `content`
    String sql = "SELECT `title` FROM `pages2` WHERE `page` = 'about'";

    String page = "";
    
    try {
      
      Connection conn = ds.getConnection();
      Statement st = conn.createStatement();

      ResultSet res = st.executeQuery(sql);
      while(res.next()) {
        page = res.getString("title");
      }
      
    } catch (SQLException e) {
        throw new RuntimeException(e);
    }
    
    model.addObject("db_title", page);
    
    return model;
  }
}
...
Рейтинг: 0 / 0
NPE для dataSource.getConnection()
    #38197598
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пациент безнадежен.
...
Рейтинг: 0 / 0
NPE для dataSource.getConnection()
    #38197611
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buyboyв META-INF/ context.xml

Суть настройки DataSource на сервере, в том чтобы настройки хранились на сервере, не зависимо от версии приложения. Тогда одно и то же приложение можно деплоить на разные сервера.
buyboy
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
  public PageController() { 
        
    try {
      Context ctx = new InitialContext();
      ds = (DataSource)ctx.lookup("java:comp/env/jdbc/mydb");
    } catch (NamingException e) {
      e.printStackTrace();
    }        



И чем Spring не угодил?
...
Рейтинг: 0 / 0
NPE для dataSource.getConnection()
    #38198512
buyboy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в итоге получил два рабочих варианта доступа к БД:

на основе context.xml =
Код: java
1.
2.
DataSource ds = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/mydb");
JdbcTemplate jdbc = new JdbcTemplate(ds);


и на основе бина =
Код: java
1.
2.
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
DataSource ds = (DataSource) context.getBean("dataSource");
...
Рейтинг: 0 / 0
NPE для dataSource.getConnection()
    #38198558
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
facepalm
...
Рейтинг: 0 / 0
NPE для dataSource.getConnection()
    #38198570
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YouTube Video
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / NPE для dataSource.getConnection()
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]