MySQL Datasource kontra Maven

0

Witam, mam problem wydawałoby się banalny ale zjadłem już na nim własne zęby. Mam za zadanie stworzyć kontekst aplikacji, by nawiązywała ona połączenie z bazą danych. Podany poniżej kod działa:

public class ConnectionTest {
    public static void main(String[] args) throws SQLException, ClassNotFoundException {
        Class.forName("com.mysql.cj.jdbc.Driver");

        Connection c = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC",
                "root",
                "Pangeon66#");
        Statement s = c.createStatement();
        String q = "SELECT * FROM users;";
        ResultSet rs = s.executeQuery(q);

        String email = null;
        String name = null;
        while (rs.next()) {
            email = rs.getString("email");
            name = rs.getString("name");
            System.out.println(email + " " + name);
        }
        if(s != null) s.close();
        if(rs != null) rs.close();
        if(c != null) c.close();
    }
}

I nie ma w tym nic skomplikowanego. Gdy jednak postawiłem sobie wszystko ładnie podzielić tzn.


@WebServlet(name = "TestConnectionServlet", value = "/TestConnectionServlet")
public class TestConnectionServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String q = "SELECT * FROM users;";
        try(Connection c = ConnectionProvider.connect();
            Statement s = c.createStatement();
            ResultSet rs = s.executeQuery(q))
        {
            PrintWriter p = resp.getWriter();
            while (rs.next()) {
                p.println(rs.getString("email"));
                p.println("::");
                p.println(rs.getString("name"));
                System.out.println(rs.getString("email"));
                System.out.println(rs.getString("name"));
            }
        } catch (SQLException e) {
            req.getRequestDispatcher("error.jsp").forward(req, resp);
            e.printStackTrace();
        }
    }
}

public class ConnectionProvider {
    private static DataSource ds;

    public static Connection connect() throws SQLException {
        return getDSInstance().getConnection();
    }

    private static DataSource getDSInstance() {
        if (ds == null) {
            try {
                Context ic = new InitialContext();
                Context ec = (Context) ic.lookup("java:comp/env");
                ds = (DataSource) ec.lookup("jdbc/test");
            } catch (NamingException e) {
                e.printStackTrace();
            }
        }
        return ds;
    }
}

Okazało się, że pojawiły się problemy NullPointerException, brak identyfikacji sterownika. Podany sposób łączenia się z bazą już stosowałem; bez użycia Mavena było okej. Naprawdę nie wiem co w tej konfiguracji jest nie tak, czemu to takie upierdliwe. Brakuje mi pomysłów. Proszę o pomoc, wskazówki. To co jest internecie nie pomogło mi.

WEB.XML

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <resource-ref>
    <description>JMTrain Connection</description>
    <res-ref-name>jdbc/test</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>
</web-app>

CONTEXT.XML

<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <Resource name="jdbc/test"
              auth="Container"
              type="javax.sql.DataSource"
              initialSize="10"
              maxTotal="100"
              maxIdle="30"
              maxWaitMillis="10000"
              username="root"
              password="Pangeon66#"
              driverClassName="com.mysql.cj.jdbc.Driver"
              url="jdbc:mysql://localhost:3306/test?useSSL=false&amp;serverTimezone=UTC" />
</Context>
```
[](http://)https://github.com/pangeon/JMTrain
0

Zgaduje ze:

  • budujesz z tego lekkiego jara bez zależności
  • wrzucasz to do odpalenia na jakimś tomcacie

Musisz zrobić fat-jar/war jeśli chcesz coś takiego zrobić.

0

Witam, problem się rozwiązał, a był to problem konfiguracyjny - nie wiem czy to wina IDE czy Mavena, nie opisane nigdzie gdzie to ustawić, no ale pliki webapp i klasy muszą być na tym samym poziomie czyli katalog src/main; w webapp/META-INF jest jest context.xml i wtedy działa. Nadal mnie zastawia gdzie to dziadostwo skonfigurować, używam IntelliJ IDEA. Czasem to się wydaje, że cała ta graficzna zasłona wcale mi nie pomaga...

1 użytkowników online, w tym zalogowanych: 0, gości: 1