Java servlet with db postgresql

di il
18 risposte

Java servlet with db postgresql

Salve ragazzi

ho un errore in Java su postgresql

praticamente faccio una query di insert
String sql ="insert into Users(nickname,email,password) values('"+user.getUser()+"','"+user.getEmail()+"','"+user.getPassword()+"')";
		st.executeUpdate(sql);
e mi si verifica quest errore
org.postgresql.util.PSQLException: ERROR: syntax error at or near "not"
  Posizione: 20
pero a salvare nel DB salva ma da errore

18 Risposte

  • Re: Java servlet with db postgresql

    Sicuro che l'errore venga dalla linea in questione e non da un'altra parte?
    Hai provato a stampare sql, per vedere cosa vai ad eseguire? Se hai detto che salva, direi che la query e' ok ma l'errore arriva da qualche altro punto dell'applicazione. Comincia a stampare la stringa
  • Re: Java servlet with db postgresql

    Come stampo??? con che comando??
  • Re: Java servlet with db postgresql

    chry1991 ha scritto:


    come stampo??? con che comando??
  • Re: Java servlet with db postgresql

    sottovento ha scritto:


    Sicuro che l'errore venga dalla linea in questione e non da un'altra parte?
    Hai provato a stampare sql, per vedere cosa vai ad eseguire? Se hai detto che salva, direi che la query e' ok ma l'errore arriva da qualche altro punto dell'applicazione. Comincia a stampare la stringa
    come stampo??? con che comando?
  • Re: Java servlet with db postgresql

    Se hai un debugger a disposizione, usalo per controllare il valore della variabile; se non ce l'hai, prova a metterla in un tag di debug che visualizzi temporaneamente nella pagina di risposta, e che poi togli.
    Se anche questo non va, scrivilo su un file di log.

    Ad ogni modo, il sospetto e' che il problema sia da un'altra parte
  • Re: Java servlet with db postgresql

    sottovento ha scritto:


    Se hai un debugger a disposizione, usalo per controllare il valore della variabile; se non ce l'hai, prova a metterla in un tag di debug che visualizzi temporaneamente nella pagina di risposta, e che poi togli.
    Se anche questo non va, scrivilo su un file di log.

    Ad ogni modo, il sospetto e' che il problema sia da un'altra parte

    su eclipse c'è il debug....io l'ho fatto partire ma non mi segnala nulla, le variabili prendono tutti valori corretti...non so cosa sia sto errore
  • Re: Java servlet with db postgresql

    Beh, un passo avanti l'hai fatto, no?
    Le variabili sono corrette, l'inserimento funziona (hai visto i dati), e non vengono sollevate eccezioni in quel punto (o sbaglio?).

    Allora, possiamo essere abbastanza sicuri di quel pezzo di codice. Andiamo al successivo. Ci deve essere un'altra query, da qualche parte, che ti produce quell'errore
  • Re: Java servlet with db postgresql

    sottovento ha scritto:


    Beh, un passo avanti l'hai fatto, no?
    Le variabili sono corrette, l'inserimento funziona (hai visto i dati), e non vengono sollevate eccezioni in quel punto (o sbaglio?).

    Allora, possiamo essere abbastanza sicuri di quel pezzo di codice. Andiamo al successivo. Ci deve essere un'altra query, da qualche parte, che ti produce quell'errore
    eh guarda io di query ne faccio due, una di insert e una di select....ti posto il codice, nel db i valori sono corretti nel caso della insert.
    package servlet;
    
    
    import java.io.*;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.*;
    
    import javax.servlet.*;
    import javax.servlet.http.*;
    
    import database.Database;
    import database.DatabaseConfiguration;
    import database.PostgresDB;
    import database.User;
    import database.UserRepository;
    import static java.lang.String.*;
    
    public class ExampleServlet extends HttpServlet {
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = 1L;
    	//Database db;
    	//UserRepository ur;
    	User user;
    	//DatabaseConfiguration config;
    	String nicknameAsString;
    	String emailAsString;
    	String passwordAsString;
    	String repeatAsString;
    	PostgresDB db;
    	Statement st;
    	String nickname,email,password,repeat;
    	
    	@Override
    	protected void service(HttpServletRequest request,
    			HttpServletResponse response) throws ServletException, IOException {
    		
    			try {
    				receiveNickname(request, response);
    				receiveLoginData(request,response);
    			} catch (ClassNotFoundException e1) {
    				// TODO Auto-generated catch block
    				e1.printStackTrace();
    			} catch (SQLException e1) {
    				// TODO Auto-generated catch block
    				e1.printStackTrace();
    			}
    			
    		try {
    			db = new PostgresDB();
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    			
    			
    	}
    
    	/*
    	private void doTempConversion(HttpServletRequest request, HttpServletResponse response) throws IOException {
    		try {
    			String celsiusAsString = request.getParameter("celsius");
    			String json;
    			if (celsiusAsString == null) {
    				json = "{}";
    			} else {
    				double celsius = Double.valueOf(celsiusAsString);
    				double fahrenheit = celsius * 9 / 5.0 + 32;
    				Map<String, Object> values = new HashMap<String, Object>();
    				values.put("celsius", celsius);
    				values.put("fahrenheit", fahrenheit);
    				json = mapToJson(values);
    				json = format("{ \"celsius\": %s, \"fahrenheit\": %s }",
    						celsius, fahrenheit);
    			}
    			response.setContentType("application/json");
    			response.getWriter().write(json);
    		} catch (NumberFormatException e) {
    			response.setContentType("application/json");
    			response.getWriter().write(
    					format("{ \"error\": \"invalid value\" }"));
    		}
    		}
    	
    	*/
    	
    	
    	private void receiveNickname(HttpServletRequest request, HttpServletResponse response) throws IOException, ClassNotFoundException, SQLException {
    		Class.forName("org.postgresql.Driver");
    		Connection conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/mastermind_development","mastermind","secret");
    		st = conn.createStatement();
    		
    		
    		try {
    		nicknameAsString = request.getParameter("nickname");
    		emailAsString = request.getParameter("email");
    		passwordAsString = request.getParameter("password");
    		repeatAsString = request.getParameter("repeat");
    		String json;
    		
    		if (nicknameAsString == null && emailAsString == null && passwordAsString == null && repeatAsString == null) {
    			json = "{}";
    		} else {
    			nickname = nicknameAsString;
    			email = emailAsString;
    			password = passwordAsString;
    			repeat = repeatAsString;
    			User u = new User(nickname,email,password);
    			Map<String, Object> users = new HashMap<String, Object>();
    			users.put("nickname", nicknameAsString);
    			users.put("email", emailAsString);
    			users.put("password", passwordAsString);
    			users.put("repeat", repeatAsString);
    			json = mapToJson(users);
    
    			
    	json = format("{\"nickname\": \"%s\", \"email\": \"%s\", \"password\": \"%s\", \"repeat\": \"%s\" }",
    		nicknameAsString,emailAsString,passwordAsString,repeatAsString);
    		
    	
    	
    			addUser(u);
    	
    		
    			}
    		
    		response.setContentType("application/json");
    		response.getWriter().write(json);
    		System.out.println(json);
    		
    		}catch (NumberFormatException e) {
    			response.setContentType("application/json");
    			response.getWriter().write(
    					format("{ \"error\": \"invalid value\" }"));
    		}
    		
    	}
    
    	
    	
    	private String mapToJson(Map<String, Object> values) {
    		return null;
    	}
    	
    	public void addUser(User user) throws SQLException{
    		 
    		String sql ="insert into Users(nickname,email,password) values('"+user.getUser()+"','"+user.getEmail()+"','"+user.getPassword()+"')";
    		st.executeUpdate(sql);
    	}
    	
    	private void receiveLoginData(HttpServletRequest request, HttpServletResponse response) throws ClassNotFoundException, SQLException, IOException{
    		Class.forName("org.postgresql.Driver");
    		Connection conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/mastermind_development","mastermind","secret");
    		st = conn.createStatement();
    		
    		try {
    			nicknameAsString = request.getParameter("nick");
    			passwordAsString = request.getParameter("pass");
    			String json;
    			
    			if (nicknameAsString == null && passwordAsString == null){
    				json = "{}";
    			} else {
    				nickname = nicknameAsString;
    				password = passwordAsString;
    				Map<String, Object> users = new HashMap<String, Object>();
    				users.put("nickname", nicknameAsString);
    				users.put("email", passwordAsString);
    				json = mapToJson(users);
    
    				
    				json = format("{ \"nickname\": %s, \"password\": %s }",
    					nicknameAsString,passwordAsString);
    				
    				//UserExists();
    				
    	}
    			response.setContentType("application/json");
    			response.getWriter().write(json);
    			System.out.println(json);
    			
    }catch (NumberFormatException e) {
    	response.setContentType("application/json");
    	response.getWriter().write(
    			format("{ \"error\": \"invalid value\" }"));
    }
    }
    	
    	
    	public void UserExists() throws SQLException{
    		String sql = "SELECT nickname,password from Users where '" + nickname +"' and password = '" + password +"'";
    		ResultSet rs = st.executeQuery(sql);
    		
    		while(rs.next()){
    			String nick = rs.getString("nickname");
    			String pass = rs.getString("password");
    			System.out.print(nick);
    			System.out.print(pass);
    		}
    		rs.close();
    	
    	}
    }

    entrambe le query producono lo stesso errore
  • Re: Java servlet with db postgresql

    Ciao
    Innanzitutto, volevo farti i complimenti per come scrivi il codice: e' chiaro e pulito.
    Avrei qualche suggerimento che mi piacerebbe tu valutassi:
    1 - Effettui la connessione al database all'interno di receiveNickname(). Poi, l'oggetto che rappresenta la connessione viene perso all'uscita di questo metodo. Secondo me sarebbe opportuno essere sicuri al 100% che la connessione sia stabilita all'inizio, quindi potresti stabilirla nel costruttore e far diventare l'oggetto conn una variabile membro;
    2 - al contrario, crei uno Statement come variabile membro e lo usi un po' dappertutto. Ho visto che lo vai a creare in diversi punti del codice, questo potrebbe causare la perdita di risorse, in particolare quando vai ad aprire un nuovo statement mentre ce n'e' uno gia' aperto.
    Il mio suggerimento, anche al fine di evitare effetti collaterali, sarebbe quello di creare un nuovo statement localmente utilizzando la connessione, e poi chiuderlo una volta completato il lavoro.
    Per esempio, se usi java 7 o successivi, puoi usare il try-with-resources:
    
        public void addUser(User user) throws SQLException
        {
            try (Statement st = conn.createStatement())
            {
                String sql ="insert into Users(nickname,email,password) values('"+user.getUser()+"','"+user.getEmail()+"','"+user.getPassword()+"')";
                st.executeUpdate(sql);
            }
            catch (SQLException e)
            {
                e.printStackTrace(System.out);
                throw(e);
            }
        }
    
    Cosi' sei sicuro che lo statement e' usato solo qui e per questa query, e non e' riutilizzato da altre parti.

    Se utilizzi delle versioni di Java inferiori, non hai a disposizione il try-with-resources e devi prestare un po' piu' attenzione a rilasciare lo statement.
    Per esempio, potresti fare:
    
        public void addUser(User user) throws SQLException
        {
            Statement st = null;
            try 
            {
                st = conn.createStatement())
                String sql ="insert into Users(nickname,email,password) values('"+user.getUser()+"','"+user.getEmail()+"','"+user.getPassword()+"')";
                st.executeUpdate(sql);
            }
            catch (SQLException e)
            {
                e.printStackTrace(System.out);
                throw(e);
            }
            finally
            {
                try
                {
                    if (st != null)
                        st.close;
                }
                catch (SQLException e) { }
            }
        }
    
    Per riassumere: tieni la connessione come variabile membro ed usa statement localmente, assicurandoti di crearli e di chiuderli in ogni caso, anche in caso di eccezione.

    Una volta fatte queste modifiche, possiamo controllare ancora gli eventuali errori, avendo pero' la certezza che non dipendono da riutilizzi (o addirittura utilizzi contemporanei) dello stesso statement
  • Re: Java servlet with db postgresql

    sottovento ha scritto:


    Ciao
    Innanzitutto, volevo farti i complimenti per come scrivi il codice: e' chiaro e pulito.
    Avrei qualche suggerimento che mi piacerebbe tu valutassi:
    1 - Effettui la connessione al database all'interno di receiveNickname(). Poi, l'oggetto che rappresenta la connessione viene perso all'uscita di questo metodo. Secondo me sarebbe opportuno essere sicuri al 100% che la connessione sia stabilita all'inizio, quindi potresti stabilirla nel costruttore e far diventare l'oggetto conn una variabile membro;
    2 - al contrario, crei uno Statement come variabile membro e lo usi un po' dappertutto. Ho visto che lo vai a creare in diversi punti del codice, questo potrebbe causare la perdita di risorse, in particolare quando vai ad aprire un nuovo statement mentre ce n'e' uno gia' aperto.
    Il mio suggerimento, anche al fine di evitare effetti collaterali, sarebbe quello di creare un nuovo statement localmente utilizzando la connessione, e poi chiuderlo una volta completato il lavoro.
    Per esempio, se usi java 7 o successivi, puoi usare il try-with-resources:
    
        public void addUser(User user) throws SQLException
        {
            try (Statement st = conn.createStatement())
            {
                String sql ="insert into Users(nickname,email,password) values('"+user.getUser()+"','"+user.getEmail()+"','"+user.getPassword()+"')";
                st.executeUpdate(sql);
            }
            catch (SQLException e)
            {
                e.printStackTrace(System.out);
                throw(e);
            }
        }
    
    Cosi' sei sicuro che lo statement e' usato solo qui e per questa query, e non e' riutilizzato da altre parti.

    Se utilizzi delle versioni di Java inferiori, non hai a disposizione il try-with-resources e devi prestare un po' piu' attenzione a rilasciare lo statement.
    Per esempio, potresti fare:
    
        public void addUser(User user) throws SQLException
        {
            Statement st = null;
            try 
            {
                st = conn.createStatement())
                String sql ="insert into Users(nickname,email,password) values('"+user.getUser()+"','"+user.getEmail()+"','"+user.getPassword()+"')";
                st.executeUpdate(sql);
            }
            catch (SQLException e)
            {
                e.printStackTrace(System.out);
                throw(e);
            }
            finally
            {
                try
                {
                    if (st != null)
                        st.close;
                }
                catch (SQLException e) { }
            }
        }
    
    Per riassumere: tieni la connessione come variabile membro ed usa statement localmente, assicurandoti di crearli e di chiuderli in ogni caso, anche in caso di eccezione.

    Una volta fatte queste modifiche, possiamo controllare ancora gli eventuali errori, avendo pero' la certezza che non dipendono da riutilizzi (o addirittura utilizzi contemporanei) dello stesso statement

    sisi era provvisorio per ora usare il db cosi, le query poi le spostero' in una classe repo che fara' solo ed esclusivamente le query...in modo da non inzozzare la servlet...ma il problema che mi da errore su un NOT che non capisco cosa sia e cosa intende per questo not...come se ci fosse un not null da qualche parte scritto in un posto sbagliato
  • Re: Java servlet with db postgresql

    E' per questo che ti ho suggerito di riorganizzare il codice: la mia paura e' che piu' thread possano utilizzare il tuo oggetto, conseguentemente utilizzare la stessa statement.
    In pratica, ho paura che quel "NOT" che vedi sia il risultato di chiamate contemporanee, visto che non hai query che utilizzino la NOT (in verita' non ho potuto vedere la stringa pronta per essere eseguita, ma tu l'hai vista e hai detto che e' ok).

    Riscrivendo il codice in quel modo, ti proteggi da questi problemi e quindi dovresti avere un comportamento piu' facile da analizzare, anzi, probabilmente l'errore sparisce
  • Re: Java servlet with db postgresql

    sottovento ha scritto:


    E' per questo che ti ho suggerito di riorganizzare il codice: la mia paura e' che piu' thread possano utilizzare il tuo oggetto, conseguentemente utilizzare la stessa statement.
    In pratica, ho paura che quel "NOT" che vedi sia il risultato di chiamate contemporanee, visto che non hai query che utilizzino la NOT (in verita' non ho potuto vedere la stringa pronta per essere eseguita, ma tu l'hai vista e hai detto che e' ok).

    Riscrivendo il codice in quel modo, ti proteggi da questi problemi e quindi dovresti avere un comportamento piu' facile da analizzare, anzi, probabilmente l'errore sparisce

    ok dopo appena ho un attimino di tempo provo grazie nel frattempo
  • Re: Java servlet with db postgresql

    Ho provato e ho provato anche a riscrivere la query, non capisco dove è sto not maledetto
    la query ora è cosi:
    public void addUser(User user) throws SQLException{
    		 
    		//String sql ="insert into Users(nickname,email,password) values('"+user.getUser()+"','"+user.getEmail()+"','"+user.getPassword()+"')";
    		//st.executeUpdate(sql);
    		String nick = user.getUser();
    		String email = user.getEmail();
    		String pass = user.getPassword();
    		Connection conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/mastermind_development","mastermind","secret");
    		PreparedStatement Ut = null;
    		Ut = (PreparedStatement) conn.prepareStatement("INSERT INTO Users"+"(nickname,email,password)VALUES(?,?,?);");
    		Ut.setString(1, nick);
    		Ut.setString(2, email);
    		Ut.setString(3, pass);
    		Ut.executeUpdate();
    	}
  • Re: Java servlet with db postgresql

    Beh, cerca di metterci qualche stampa, altrimenti non sai ancora se l'errore e' li.
    prova cosi' (non l'ho provata, potrebbe esserci qualche errorino di sintassi):
    
    public void addUser(User user) throws SQLException
    {
        String nick = user.getUser();
        String email = user.getEmail();
        String pass = user.getPassword();
        try (Connection conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/mastermind_development","mastermind","secret");
             PreparedStatement Ut = (PreparedStatement) conn.prepareStatement("INSERT INTO Users"+"(nickname,email,password)VALUES(?,?,?);"))
        {
            Ut.setString(1, nick);
            Ut.setString(2, email);
            Ut.setString(3, pass);
            int count = Ut.executeUpdate();
            System.out.println ("Execution Ok. Count=" + count);
        }
        catch (SQLException e)
        {
            e.printStackTrace(System.out);
            throw(e);
        }
    }
    
    
    Cosa vedi? Execution Ok? Se l'esecuzione e' ok, executUpdate() ti ritorna il numero di record inseriti, che ovviamente deve essere 1. E' cosi'? Invece vedi l'eccezione?

    Il tuo codice e' corretto, quindi molto probabilmente viene eseguito e poi si passa ad altro. Quindi non sai ancora se l'errore e' in quel pezzo di codice o no, per questo ho aggiunto le println() (e la chiusura della connessione e dello statement).

    Ricorda: la sintassi che ho scritto e' valida se hai almeno java 7, o java 8; per versioni precedenti, devi cambiare
Devi accedere o registrarti per scrivere nel forum
18 risposte