Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / NPE для dataSource.getConnection() / 19 сообщений из 19, страница 1 из 1
25.03.2013, 13:37:00
    #38197258
buyboy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NPE для dataSource.getConnection()
всем привет

не могу соединиться с базой из контроллера в 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
25.03.2013, 13:39:29
    #38197264
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NPE для dataSource.getConnection()
Где XML для инъекции dataSource в MyPageController?
...
Рейтинг: 0 / 0
25.03.2013, 13:52:05
    #38197280
buyboy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NPE для dataSource.getConnection()
BlazkowiczГде XML для инъекции dataSource в MyPageController?не понял... в контроллере нужен какой-то дополнительный функционал по подключению dataSource из applicationContext.xml ?
...
Рейтинг: 0 / 0
25.03.2013, 13:53:42
    #38197284
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NPE для dataSource.getConnection()
buyboyне понял... в контроллере нужен какой-то дополнительный функционал по подключению dataSource из applicationContext.xml ?
ОК. Кто и почему, по-вашему, должен вызвать метод setDataSource(...)?
...
Рейтинг: 0 / 0
25.03.2013, 14:32:06
    #38197336
buyboy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NPE для dataSource.getConnection()
BlazkowiczОК. Кто и почему, по-вашему, должен вызвать метод setDataSource(...)?честно говоря думал - фрэймворк прочитает параметры бина сам...
...
Рейтинг: 0 / 0
25.03.2013, 14:36:44
    #38197343
buyboy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NPE для dataSource.getConnection()
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
25.03.2013, 14:38:16
    #38197347
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NPE для dataSource.getConnection()
buyboyчестно говоря думал - фрэймворк прочитает параметры бина сам...
"Сам", значит Auto. Нужная фича называется Autowire. Для управления ей существует соответствующая аннотация.
Существует так же мнение, что если мешать в куча инъекции через аннотации и через XML, то это приведёт к новым багам.
Поэтому, если у вас всё в XML, просто добавьте свойство в XML со ссылкой на dataSource бин.
...
Рейтинг: 0 / 0
25.03.2013, 14:45:11
    #38197358
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NPE для dataSource.getConnection()
buyboyне получилось прочитать applicationContext.xml из WEB-INF
граждане, ну читайте же уже документацию. ну что за весеннее обострение такое.
...
Рейтинг: 0 / 0
25.03.2013, 15:19:40
    #38197403
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NPE для dataSource.getConnection()
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
25.03.2013, 15:22:31
    #38197411
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NPE для dataSource.getConnection()
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
25.03.2013, 15:33:01
    #38197429
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NPE для dataSource.getConnection()
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
25.03.2013, 15:46:09
    #38197451
buyboy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NPE для dataSource.getConnection()
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
25.03.2013, 15:49:55
    #38197457
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NPE для dataSource.getConnection()
buyboyа как тогда получить connection в контроллере?
Т.е. понимания зачем все эти XML вообще нужны нет и не приходит?

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

в 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
25.03.2013, 16:52:34
    #38197598
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NPE для dataSource.getConnection()
пациент безнадежен.
...
Рейтинг: 0 / 0
25.03.2013, 16:56:04
    #38197611
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NPE для dataSource.getConnection()
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
26.03.2013, 13:05:38
    #38198512
buyboy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NPE для dataSource.getConnection()
в итоге получил два рабочих варианта доступа к БД:

на основе 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
26.03.2013, 13:29:09
    #38198558
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NPE для dataSource.getConnection()
facepalm
...
Рейтинг: 0 / 0
26.03.2013, 13:32:49
    #38198570
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NPE для dataSource.getConnection()
YouTube Video
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / NPE для dataSource.getConnection() / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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